Autore Topic: Ricorsione. Caspita! che contorsione?  (Letto 749 volte)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Ricorsione. Caspita! che contorsione?
« il: 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:
« Ultima modifica: 27 Gennaio 2017, 10:52:13 da kicco »
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Caspita! che contorsione?
« Risposta #1 il: 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
« Ultima modifica: 26 Gennaio 2017, 23:47:20 da Top Fuel »
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Caspita! che contorsione?
« Risposta #2 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Caspita! che contorsione?
« Risposta #3 il: 27 Gennaio 2017, 08:41:44 »
 :ok: Grazie ad entrambi!
Studio!
 :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #4 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #5 il: 28 Gennaio 2017, 20:49:34 »
È  questo che intendi dire?

Sì.
...mo' che sorpresa al riguardo hai ?  :-X
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #6 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #7 il: 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. :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #8 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #9 il: 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?
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #10 il: 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.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #11 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #12 il: 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
« Ultima modifica: 01 Febbraio 2017, 17:10:28 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Ricorsione. Caspita! che contorsione?
« Risposta #13 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)