Gambas-it

Gambas3 => Programmazione => Topic aperto da: kicco - 26 Gennaio 2017, 22:06:56

Titolo: Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 26 Gennaio 2017, 22:06:56
Poi cambio il titolo! (ho aggiunto Ricorsione)
Stavo giocando con la successione di Fibonacci e nel wiki ho trovato:
Codice: [Seleziona]
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? ???
Codice: [Seleziona]
    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:
Titolo: Re:Caspita! che contorsione?
Inserito da: Top Fuel - 26 Gennaio 2017, 23:43:04
Si chiama ricorsione.
E' una tecnica di programmazione in cui una funzione richiama se stessa. Non è il massimo dell'efficenza, ma in alcuni casi è indispensabile.
Per approfondire: https://it.wikipedia.org/wiki/Algoritmo_ricorsivo (https://it.wikipedia.org/wiki/Algoritmo_ricorsivo)
Titolo: Re:Caspita! che contorsione?
Inserito da: vuott - 26 Gennaio 2017, 23:59:47
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:
Codice: [Seleziona]
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.
Titolo: Re:Caspita! che contorsione?
Inserito da: kicco - 27 Gennaio 2017, 08:41:44
 :ok: Grazie ad entrambi!
Studio!
 :ciao:
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 28 Gennaio 2017, 18:05:16
Citazione
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:
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: vuott - 28 Gennaio 2017, 20:49:34
È  questo che intendi dire?

Sì.
...mo' che sorpresa al riguardo hai ?  :-X
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 29 Gennaio 2017, 18:06:32
Citazione
...mo' che sorpresa al riguardo hai ?  :-X
;D
per ora nessuna, perlomeno non premeditata... :P
Ho "studiato" la faccenda e la sensazione che ho avuto da subito, si è rivelata corretta:
Cioè la ricorsione impiega molta memoria perché ad ogni "giro" viene occupata nuova memoria!
Un vero "buco nero" :D
 :ciao:
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: Top Fuel - 29 Gennaio 2017, 22:27:18
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:
Codice: [Seleziona]
SUB Miasub() STATIC
...
END SUB
Mentre in Gambas non mi risulta sia possibile. Attendo di essere smentito as usual. :)
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: Gianluigi - 29 Gennaio 2017, 23:03:01
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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:
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 01 Febbraio 2017, 16:16:07
Citazione
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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?
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: Gianluigi - 01 Febbraio 2017, 16:20:04

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.
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 01 Febbraio 2017, 16:41:08

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.
Codice: [Seleziona]
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:
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: Gianluigi - 01 Febbraio 2017, 16:57:00
Ma ibo non è zero e se io moltiplico per zero cosa ottengo?

Se passi a ibo ia  vedi che si mantiene il valore oppure cambia esempio.

Comunque penso di aver frainteso la domanda, la funzione mantiene il valore la variabile dinamica no.
Solo ciò che è Static mantiene il valore fra una chiamata e l'altra.

Scusa
Titolo: Re:Ricorsione. Caspita! che contorsione?
Inserito da: kicco - 01 Febbraio 2017, 20:04:17
Ma ibo non è zero e se io moltiplico per zero cosa ottengo?
Sì hai ragione... comunque anche se fosse stato  iBO = ia + iBO non sarebbe cambiato nulla...
 :ciao: