Poi cambio il titolo! (ho aggiunto Ricorsione)
Stavo giocando con la successione di Fibonacci e nel wiki ho trovato:
Public Sub Main()
Print "Fibonacci(28) = "; Fibonacci(28)
End
Private Function Fibonacci(n As Integer) As Integer
If (n < 2) Then
Return n
Else
Return Fibonacci(n - 2) + Fibonacci(n - 1)
Endif
End
Ho avuto un attimo di smarrimento...
La funzione Fibonacci richiama se stessa? ???
Return Fibonacci(n - 2) + Fibonacci(n - 1)
...o il Vermentino di Sardegna con la pasta allo scoglio di cena che mi ha colpito? :rolleyes:
:P
:ciao:
Come ha già chiarito Top Fuel, si è in presenza di una "Ricorsione", ed in quel caso si ha un esempio di funzione ricorsiva con ricorsione multipla.
Guarda quest'altro esempio:
Private l As Long
Public Sub Main()
Print "Eterno ritorno = "; l
Sleep 0.3
Inc l
Main()
End
Da notare che, sebbene vi sia un ritorno alla medesima routine, la visibilità delle variabili locali si spegne.
Cioè se invece di dichiarare una variabile di tipo Private, avessi usato una variabile locale (dim l as long), al rientro nella funzione (in questo caso nel Main) si sarebbe annullata per poi generarsi nuovamente, ovviamente con valore iniziale=0, ogni volta?
È questo che intendi dire?
:ciao:
E' così fin dai tempi del Quick Basic, all'uscita di una procedura le variabili locali venivano distrutte per poi essere ricreate alla chiamata successiva. L'unica differenza è che nel QB era possibile conservare le variabili tra una chiamata e l'altra usando la parola STATIC all'inizio della procedura, in questa maniera:
SUB Miasub() STATIC
...
END SUB
Mentre in Gambas non mi risulta sia possibile. Attendo di essere smentito as usual. :)
E' così fin dai tempi del Quick Basic, all'uscita di una procedura le variabili locali venivano distrutte per poi essere ricreate alla chiamata successiva. L'unica differenza è che nel QB era possibile conservare le variabili tra una chiamata e l'altra usando la parola STATIC all'inizio della procedura, in questa maniera:
SUB Miasub() STATIC
...
END SUB
Mentre in Gambas non mi risulta sia possibile. Attendo di essere smentito as usual. :)
Si lo puoi usare anche in Gambas ma solo in una classe, ad esempio:
Public Sub Form_Open()
Print "Fibonacci(28) = "; Fibonacci(28)
End
Static Private Function Fibonacci(n As Integer) As Integer
If (n < 2) Then
Return n
Else
Return Fibonacci(n - 2) + Fibonacci(n - 1)
Endif
End
:ciao:
Quindi se i antepongo (esempio Gianluigi) la parola STATIC alla procedura, le variabili dichiarate (per esempio Dim i as integer) dentro la procedura non vengono azzerate all'uscita?
Giusto è proprio quello il significato di static.
Public Sub Form_Open()
Dim i As Byte
For i = 1 To 3
Print "ia * iBO= "; BO(i)
Next
End
Static Private Function BO(ia As Integer) As Integer
Dim iBO As Integer
iBO = ia * iBO
Return iBO
End
Ho scritto questo codice, ma iBO si azzera sempre!
Cosa non ho capito?
:ciao: