Funzione a tratti con ricorsione

di il
1 risposte

Funzione a tratti con ricorsione

Ciao ho un problema con un funzione a tratti che presenta anche una ricorsione. Non avendo dimistichezza con Matlab, ma dovendo comunque portare a termine un progetto, ringrazio già in anticipo chiunque mi aiuterà<3. In input alla funzione ho due vettori, i cui elementi sono incognite, che chiamo x e z , e la funzione dovrebbe restituirmi uno scalare ed un vettore. In più i valori della funzione sono soggetti a dei vincoli. In particolare per ogni giorno del mese, g, devo calcolare il valore della funzione f in funzione di due parametri x e z. So già che per g=1, f(1)=f(30)+ x(1), che per g=9, f(9)=20, e che per ogni g f(x,z)>0. Riporto ora come ho scritto tutto su matlab.

function y=f(x,z)
 for g=1:1:30
 If g==1
 y(1) = y(30)+x(1) %qui la funzione mi da 
 If g==9         % uno scalare 
 y(9)=20 %qui ho messo solo = perché 
          %>= mi segnava errore
 else 
 y(g)=y(g-1)*x(g)*y(g); %qui la funzione  dovrebbe darmi
                        %un vettore.
 end
 end
 end

 Ho provato anche a seguire i consigli per evitare la ricorsione finale, ma purtroppo non mi è possibile assegnare un valore iniziale alla funzione, in quanto esso è incognito. So che questa funzione è abbastanza complessa, quindi ringrazio di cuore chi riesca ad aiutarmi.

1 Risposte

  • Re: Funzione a tratti con ricorsione

    Ci sono diversi “orrori” concettuali!

    1. y e' il nome della variabile usata all'interno della funzione e ritornata come risultato della funzione stessa.
    2. da nessuna parte c'e' scritto che y deve essere un vettore di 30 elementi. Nessuno lo crea. Se per un valore intero/float non e' un problema, i vettori vanno “allocati”
    3. g e' in iteratore, cioe' una variabile che vale 1,2,3,…30. Ok
    4. ma quando g e' uguale ad 1, nel tuo codice y(1) 
      DIPENDE da y(30) CHE NON E' STATO ANCORA CALCOLATO, 
      quindi COME FAI A CALCOLARLO ???
    5. quando g e' diverso da 1 e 9, y(g) DIPENDE DA y(g-1), ottimo, nessun problema perche' calcolato al passo precedente, 
      MA ANCHE DA y(g) STESSO. 
      MA SE LO STAI CALCOLANDO, COME FAI AD USARLO???

    .

    Mi sa che che non hai capito il concetto di “ricorsione”. 
    La tua funzione NON E' ricorsiva, ma e' implementata mediante un'ITERAZIONE/ciclo.
    Inoltre, Per come e' scritta, al di la deglli “orrori”, la tua funzione NON E' “ricorsiva” MA “vettoriale”, cioe':

    NON RITORNA un singolo scalare

    MA

    RITORNA un vettore.

    La funzione non e' complessa, e' estremamente semplice, MA scritta cosi' NON PUO' FUNZIONARE.


    Esempio di funzione ricorsiva (NON E' matlab, MA pseudocodice):

    fact(n):
       if n==0:
         return 1
       if n==1 
         return 1
       else
         return n*fact(n-1)    <=== CHIAMATA RICORSIVA

    Esempio di funzione iterativa (NON E' matlab, MA pseudocodice):

    fact(n):
       f = 1
       for i=1 to n step 1:    <=== CICLO
           f = f*i
       return f
Devi accedere o registrarti per scrivere nel forum
1 risposte