Programma per successione di fibonacci
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
Tieni presente che l'equazione ricorsiva è ${(a_1=0),(a_2=1),(a_(n+2)=a_(n+1)+a_n):}$
Sisi, grazie, ho fatto tanti di quegli esercizi ultimamente che lo saprò a memoria anche tra 50 anni!!
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?
Oppure stampare i primi $n$ numeri di Fibonacci?
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"));
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.
e per ognuno di questi $i$ ti calcoli e stampi l'$i$-esimo numero di FIbonacci.
Ho capito quello che intendi cioè cominciare con..
solo che dopo non so come comporre:
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.
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; }
Scusa ma io ho lavorato solo con javascript e questa scrittura mi risulta in parte sconosciuta..=(
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.
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.
"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

Grazie lo stesso, se riesco a "tradurlo" lo posto per i posteri =)
Giusto hamming_burst.
Io, non so perchè , ho sempre la manìa di volermi salvare tutti i dati che trovo
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.
Io, non so perchè , ho sempre la manìa di volermi salvare tutti i dati che trovo

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.
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):
La funzione va poi quindi chiamata con il seguente codice:
dove n è ovviamente il numero di elementi da stampare.
\[
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.
Non funziona ='(
Riesci a dirmi qual'è il problema? Io ho scritto il seguente file html:
che mi stampa:
che sono i primi 10 numeri della successioni di fibonacci. Non considero lo zero come primo numero della sequenza.
<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.
Siiiiiiiiiiiiiiiii =D
In ogni caso per farlo partire da zero basta modificare solo il primo indicatore:
comunque grazie grazie grazie!
Esattamente non ho capito bene cosa non funzionasse in quello di prima ma vabbè! =)
fib(0, 1, 10);
comunque grazie grazie grazie!
Esattamente non ho capito bene cosa non funzionasse in quello di prima ma vabbè! =)
Sì, è sufficiente cambiare quella riga. Probabilmente avevi sbagliato a scrivere qualche riga o avevi lasciato n dove ho poi scritto 10.