Programma per successione di fibonacci

sara4ever13
Come faccio a scrivere un programma per la Successione di Fibonacci (n è formato dalla somma dei due numeri precedenti (0 1 1 2 3 5 8 13..) in modo ricorsivo?

Risposte
Gi81
Tieni presente che l'equazione ricorsiva è ${(a_1=0),(a_2=1),(a_(n+2)=a_(n+1)+a_n):}$

sara4ever13
Sisi, grazie, ho fatto tanti di quegli esercizi ultimamente che lo saprò a memoria anche tra 50 anni!!

Gi81
Nel tuo programma vuoi che ti sia dato un $n$ naturale e poi tu stampi l'n-esimo numero di Fibonacci?
Oppure stampare i primi $n$ numeri di Fibonacci?

sara4ever13
Stampare i primi n numeri di Fibonacci quindi n all'interno del programma:

var n=eval(prompt("introduci quanti numeri della sequenza di Fibonacci vuoi visualizzare","100"));

Gi81
Puoi impostare un ciclo for, per $i$ che va da $1$ a $n$,
e per ognuno di questi $i$ ti calcoli e stampi l'$i$-esimo numero di FIbonacci.

sara4ever13
Ho capito quello che intendi cioè cominciare con..

for (var i=1; i<n; i++){


solo che dopo non so come comporre:

"Gi8":
per ognuno di questi $i$ ti calcoli e stampi l'$i$-esimo numero di FIbonacci.

Gi81
Questo è un possibile programma (migliorabilissimo) in C++:
#include <iostream>
#include <conio.h>
using namespace std;

int main(){
     int n; 
     do {
     cout<<"Scrivi n: (maggiore di 1) ";
     cin>>n;}
     while (n<2);
     cout<<" I primi "<<n<<" numeri di Fibonacci sono:  "<<endl;
     long int Fibonacci[n];
     Fibonacci[0]=0; 
     Fibonacci[1]=1;
     cout<<"  "<<Fibonacci[0]<<"  "<<Fibonacci[1];
     for (int i=2;i<n;i++){
         Fibonacci[i]=Fibonacci[i-1]+Fibonacci[i-2];
         cout<<"  "<<Fibonacci[i];
         }
     getch();
     return 0;
}

sara4ever13
Scusa ma io ho lavorato solo con javascript e questa scrittura mi risulta in parte sconosciuta..=(

Gi81
Ah, ok. Perdonami, ma non conosco javascript.

Comunque più o meno il discorso è questo:
Crei un vettore di $n$ elementi (quello che io ho chiamato Fibonacci), e i primi due elementi li inizializzi a $0$ e $1$.
Poi fai partire il ciclo for come hai scritto prima , e imponi che l'$i$-esimo elemento sia la somma dell'$(i-1)$-esimo elemento e dell'$(i-2)$-esimo elemento.

hamming_burst
"Gi8":
Questo è un possibile programma (migliorabilissimo) in C++:

se ricordo bene non serve nemmeno salvarsi tutti i valori ed utilizzare un array, bastan due varbili, tipo così:

integer f0,f1,f2;
f0=f1=f2=1;

if(n==0){
print 0
}
if(n==1 || n==2){
print 1
}
for (integer i = 3 to n) {

   f0 = f1
   f1 = f2
   f2 = f0+f1

   print f2
}

per il caso F(0) basta stamparlo a parte. :-)

EDIT:
così dovrebbe funzionare anche $n<3$ pensavo comunque che $F(0)=1$ e non $0$, ma controllando è giusta la vostra versione ricorsiva della successione :-)
per javascript non penso sia complicato tradurlo, alla fine è un ciclo e due if, ma su questo non so aiutare :-)

sara4ever13
Grazie lo stesso, se riesco a "tradurlo" lo posto per i posteri =)

Gi81
Giusto hamming_burst.
Io, non so perchè , ho sempre la manìa di volermi salvare tutti i dati che trovo :roll:

Effettivamente, se si vuole solo stampare senza salvare in un array, conviene fare come ha scritto hamming_burst.
Molto più veloce e (praticamente) senza utilizzare spazio.

apatriarca
Sono ovviamente sufficienti solo gli ultimi due valori per poterli stampare tutti. Nel tuo primo post hai però parlato di metodo ricorsivo e quindi vediamo come scriverlo in modo ricorsivo (senza cicli for quindi). L'idea è quella di definire la successione di fibonacci in modo diverso. Osservo che se definisco la funzione \( F_{a, b}(n) \) (con \(n \in \mathbb N - \{ 0 \}\)) come la successione
\[
F_{a, b}(n) = \left\{\begin{array}{ll} a & \mbox{se } n = 1 \\ b & \mbox{se } n = 2 \\ F_{a, b}(n-1) + F_{a, b}(n-2) & \mbox{se } n > 2 \end{array}\right.
\]
la successione di fibonacci è semplicemente \( F_{1, 1} \). Osservo inoltre che \( F_{a, b}(n) = F_{a, a+b}(n-1) \). Da queste osservazioni possiamo definire la seguente funzione ricorsiva che stampa i primi \(n\) valori della successione di fibonacci (o più in generale di una successione come quella precedente):
function fib(a, b, n) {
    if (n > 0) {
        document.writeln(a + '<br />');
        fib(b, a+b, n-1);
    }
}

La funzione va poi quindi chiamata con il seguente codice:
fib(1, 1, n);

dove n è ovviamente il numero di elementi da stampare.

sara4ever13
Non funziona ='(

apatriarca
Riesci a dirmi qual'è il problema? Io ho scritto il seguente file html:
<html>
    <body>
        <script type="text/javascript">
            function fib(a, b, n) {
                if (n > 0) {
                    document.writeln(a + '<br />');
                    fib(b, a+b, n-1);
                }
            }

            fib(1, 1, 10);
        </script>
    </body>
</html>

che mi stampa:
1
1
2
3
5
8
13
21
34
55

che sono i primi 10 numeri della successioni di fibonacci. Non considero lo zero come primo numero della sequenza.

sara4ever13
Siiiiiiiiiiiiiiiii =D

sara4ever13
In ogni caso per farlo partire da zero basta modificare solo il primo indicatore:

 fib(0, 1, 10);


comunque grazie grazie grazie!
Esattamente non ho capito bene cosa non funzionasse in quello di prima ma vabbè! =)

apatriarca
Sì, è sufficiente cambiare quella riga. Probabilmente avevi sbagliato a scrivere qualche riga o avevi lasciato n dove ho poi scritto 10.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.