View Full Version : [C]numeri di fibonacci
Dr.Speed
25-11-2006, 19:25
dovrei fare un programmino che mi calcoli i numeri di fibonacci, solo che non so da dove partire, cioe io dovrei inserire un numero e lui dovrebbe trovarmi in penultimo inserito :help:
E' un programma che si risolve facilmente con la ricorsione. Prova a scriverti su carta il "ragionamento" matematico per induzione. Da lì costruisci l'algoritmo ricorsivo. ;)
dai un occhiata qui..
http://it.wikipedia.org/wiki/Successione_di_Fibonacci
c'è anche parte del codice ;)
[...] lui dovrebbe trovarmi in penultimo inserito :help:
in che senso in penultimo inserito??
Dr.Speed
25-11-2006, 20:32
non posso usare la ricorsione, inquanto oltre a non sapere cos'e preferisco fare una cosa semplice
penultimo nel senso che dovrebbe scrivermi a schermo il numeri prima di quello che inserisco
Dr.Speed
27-11-2006, 01:11
dopo 2 notti di studi e ricerche( :sofico: )sono giunto a una conclusione!! :D :D e sembra funzionare!!
#include <stdio.h>
int main()
{
int i;
float c=1;
float b=1;
float a=0;
float d=0;
for(i=0;i<10;i++)
{
c=a+b;
printf("%f \n",c);
d=b+c;
printf("%f \n",d);
a=d+c;
printf("%f \n",a);
b=d+a;
printf("%f \n",b);
}
scanf("%d");
}
Dai che lo puoi fare ancora più corto...
Basta pensare che il numero di Fibonacci dipende solo dai due numeri precedenti... Quindi diventa chiaro che basta memorizzarsi solo i due numeri precedenti ;)
ciao Dr.Speed, sono d'accordo con cionci, il programma può diventare + corto e + semplice.
Riutilizza le variabili ad esempio con a=0 e b=1 scrivi a=a+b e non c=a+b così il valore parziale lo riassegni ad una delle due variabili senza utilizzarne un'altra nuova.
Se non riesci ti do un ulteriore aiuto. :D
ciao
Dr.Speed
27-11-2006, 17:42
grazie a tutti e due ;) stasera provo a perfezzionarlo :)
Dr.Speed
29-11-2006, 23:39
mi sto scervellando ma non riesco a capire come potrei fare :stordita:
leox@mitoalfaromeo
30-11-2006, 01:02
dovrei fare un programmino che mi calcoli i numeri di fibonacci, solo che non so da dove partire, cioe io dovrei inserire un numero e lui dovrebbe trovarmi in penultimo inserito :help:
tu studi a padova e fai il primo anno e magari di fisica o di astronomia....
no perchè ho appena finito di fare il programma a mio fratello....:D
si può fare in 2 modi.. ricorsivo o non ricorsivo. Nel secondo caso ti basta un vettore (se vuoi memorizzare tutta la serie) ed è fatto!
se vuoi farlo nel modo piu semplice allora ti dico che il modo piu semplice è quello ricorsivo...questo caso in particolare, fatto iterativamente, è incredibilmente piu difficile che non fatto ricorsivamente...
Nel secondo caso ti basta un vettore (se vuoi memorizzare tutta la serie) ed è fatto!
Si può fare anche senza vettore con 2 variabili che memorizzano i 2 valori precedenti ed una temporanea...ogni iterazione del ciclo stampa un solo numero di fibonacci...
leox@mitoalfaromeo
30-11-2006, 11:07
Si può fare anche senza vettore con 2 variabili che memorizzano i 2 valori precedenti ed una temporanea...ogni iterazione del ciclo stampa un solo numero di fibonacci...
leggi la parentesi!!!!
leggi la parentesi!!!!
Sì...volevo solo suggerirgli come farlo senza vettore...
leox@mitoalfaromeo
30-11-2006, 11:18
cmq... nota per il giovane programmatore...
Quando si usano delle variabili aiuta molto dare loro un nome sensato...
Nel codice che ha messo sopra dr.speed ci voleva molta concentrazione per capire...!
io per esempio l'avrei fatto così:
double attuale=0.0, i_meno1=0.0, i_meno2=0.0;
for (int i=0, i<50, i++) {
attuale= i_meno1+i_meno2;
cout<<attuale<<endl;
//..... hehe.. ora fallo tu...non servono altre variabili..
}
nb: se invece del double si usa il long, da fib(47) in poi viene negativo, perchè? (ESPERTI ESONERATI DALLA RISPOSTA)
repne scasb
30-11-2006, 11:57
#include <stdio.h>
#include <math.h>
void main(void)
{
int i;
short n;
printf("Numeri di Fibonacci: ");
scanf("%4d",&n);
for(i=0;i<n;i++)
printf("%.0f ",(pow(1+sqrt(5),i)-pow(1-sqrt(5),i))/(pow(2,i)*sqrt(5)));
}
Oltre il 72-esimo numero di Fibonacci sono necessarie routine in precisione multipla per un calcolo corretto (per FPU a 64bit).
leox@mitoalfaromeo
30-11-2006, 12:06
#include <stdio.h>
#include <math.h>
void main(void)
{
int i;
short n;
printf("Numeri di Fibonacci: ");
scanf("%4d",&n);
for(i=0;i<n;i++)
printf("%.0f ",(pow(1+sqrt(5),i)-pow(1-sqrt(5),i))/(pow(2,i)*sqrt(5)));
}
Oltre il 72-esimo numero di Fibonacci sono necessarie routine in precisione multipla per un calcolo corretto (per FPU a 64bit).
sviluppare la serie non valeva!!!:D
tra l'altro se l'esercizio è quello che aveva mio fratello, l'obiettivo era dimostrare che il rapporto tra 2 consecutivi tende a (1+sqrt(5))/2 (o qualcosa di simile...)
repne scasb
30-11-2006, 12:20
sviluppare la serie non valeva!!!:
Ok. Va bene Fibonacci con il doppio passo?
#include <stdio.h>
#define N 20
void main(void)
{
unsigned long i,j,n;
printf("0 1");
for(n=(N-2)>>1,i=0,j=1;n;n--)
{
i+=j;
printf(" %ld",i);
j+=i;
printf(" %ld",j);
}
}
leox@mitoalfaromeo
30-11-2006, 13:16
Ok. Va bene Fibonacci con il doppio passo?
#include <stdio.h>
#define N 20
void main(void)
{
unsigned long i,j,n;
printf("0 1");
for(n=(N-2)>>1,i=0,j=1;n;n--)
{
i+=j;
printf(" %ld",i);
j+=i;
printf(" %ld",j);
}
}
:ave:
(non ho capito una cippa...! ma io c non lo conosco)
repne scasb
30-11-2006, 14:53
(non ho capito una cippa...! ma io c non lo conosco)
Speravo in una cosa del genere:
#include <stdio.h>
#define N 20
void main(void)
{
unsigned long i=0,j=1,n;
for(n=N/2;n;n--,i+=j,j+=i)
printf("%ld %ld ",i,j);
}
Non fa niente.
Dr.Speed
30-11-2006, 18:29
grazie delle risposte, comunque studio a padova ma sono ancora alle superiori :sofico:
quindi non posso usare il metodo ricorsivo :stordita:
supersalam
30-11-2006, 21:29
Scusate questo OT
Ragazzi esiste un programma tipo Dev C per cellulari symbian? Mi sarebbe utilissimo poichè non ho un portatile.
Per l'autore del topic, ho visto proprio di recente il programma su un libro universitario. Attualmente non ho il testo perchè l'ho prestato. Appena posso ti scrivo tutto.
Dr.Speed
30-11-2006, 21:31
Ragazzi esiste un programma tipo Dev C per cellulari symbian? Mi sarebbe utilissimo poichè non ho un portatile.
non credo che qui ti risponda qualcuno, ti conviene aprirti un nuovo thread ;)
wingman87
01-12-2006, 20:01
La mia soluzione iterativa (e aggiungerei intuitiva, le vostre non le ho capite..). Calcola i numeri di fibonacci fino all'ennesimo.
#include <iostream>
using namespace std;
int main(){
double a=1,b=0
int n,i;
cin>>n;
for(i=0;i<n;i++){
if(i%2==0){
a+=b;
cout<<a<<"\n";
}else{
b+=a;
cout<<b<<"\n";
}
}
system("pause");
}
leox@mitoalfaromeo
02-12-2006, 03:10
La mia soluzione iterativa (e aggiungerei intuitiva, le vostre non le ho capite..). Calcola i numeri di fibonacci fino all'ennesimo.
#include <iostream>
using namespace std;
int main(){
double a=1,b=0
int n,i;
cin>>n;
for(i=0;i<n;i++){
if(i%2==0){
a+=b;
cout<<a<<"\n";
}else{
b+=a;
cout<<b<<"\n";
}
}
system("pause");
}
carino il pari o dispari...
ma usare 3 variabili f_i_meno1. f_i_meno2 e f_i è più rapido. tenendo conto che f_i=f_i_meno1+f_i_meno2, basta calcolare f_i e poi memorizzare f_i_meno1 in f_i_meno2 e f_i in f_i_meno1
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.