 
View Full Version : Programma in C non va...potete controllare?
Calcola i numeri di fibonacci! ovvero 0,1,1,2,3,5,8,13 ecc
(la somma degli ultimi due numeri da il successivo). l'algoritmo mi sembra giusto! cosa sbaglio?
#include <stdio.h>
#include <stdlib.h>
int fibo(int);
int main()
{ int n,fib;
printf("Programma che calcola il valre S(n)");
printf("Inserisci n= ");
scanf("%d",&n);
fib=fibo(n);
printf("Il valore è= %d \n",fib);
system ("PAUSE");
return 0;
}
int fibo(int x)
{int a,b,i,f;
a=0;
b=1;
if (x==0)
return 0;
else
{ for (i=1;i>x;i++)
{ f=a+b;
a=b;
b=f;
}
}
return f;
}
Calcola i numeri di fibonacci! ovvero 0,1,1,2,3,5,8,13 ecc
(la somma degli ultimi due numeri da il successivo). l'algoritmo mi sembra giusto! cosa sbaglio?Non so a memoria come è l'algoritmo per tale calcolo ma la tua funzione fibo() non mi sembra corretta. Mi riferisco innanzitutto al ciclo for.
Ciao.
Allora:
1) Se posti del codice è meglio se usi il tag , così viene mantenuta la formattazione (ed il messaggio diventa semanticamente corretto) ;) 
2) Sarebbe sempre di grande aiuto se tu dicessi in dettaglio qual è il problema. In  questo caso il messaggio di errore del compilatore o il risultato errato di un esempio di esecuzione sarebbe stato appropriato ;) 
3) Credo che per questo problema sia molto più adatta la soluzione ricorsiva :D 
Passiamo ora alla soluzione:
[CODE]for (i=1;i>x;i++)
Questo ciclo tradotto in italiano dice:
i vale 1;
Finchè i è maggiore di x, esegui il contenuto del for, poi incrementa i di 1.
Questo vuol dire che se a questa funzione passi un valore x >= 1 il codice all'interno del ciclo non viene eseguito nemmeno una volta.
jappilas
07-11-2007, 23:10
<...>cosa sbaglio?<...>che se imponi i > x , il ciclo non è eseguito perchè quella condizione non si verifica mai 
Non so a memoria come è l'algoritmo per tale calcolo ma la tua funzione fibo() non mi sembra corretta. Mi riferisco innanzitutto al ciclo for.in forma ricorsiva:
int fibo(int x)
{
	if (x==0)
		return 0;
	else
		if (x==1)
			return1;
		else 
			return (fibo(x-1) + fibo(x-2));
}
edit: chiedo scusa
sottovento
08-11-2007, 00:31
Si, gli estremi del ciclo sono errati. A parte la condizione di permanenza nel ciclo (i>x), devi controllare anche il valore iniziale.
se la sequenza e' (non la si ricorda mai, nemmeno dopo aver letto il Codice da Vinci :) ) 0,1,1,2,3,5,8,13,... occorre fare anche qualche altra modifica, visto che calcolerai il valore 1 una sola volta.
...
3) Credo che per questo problema sia molto più adatta la soluzione ricorsiva :D 
No, dai :)
A scuola, per esercizio, si implementa la soluzione ricorsiva, ma andare a sommare ricorsivamente 1 o 0 per fare la somma dei numeri precedenti (ottenendo cosi' un algoritmo che cresce esponenzialmente) non mi sembra proprio il massimo....
In java si può fare con un algrotimo ricorsivo ^^!!! Credo anke in c...
public int fib(int n)
{  if (n < 0)
      throw new IllegalArgumentException();
   else if (n < 2)
      return n;
   else
      return fib(n-2) + fib(n-1);
}
^TiGeRShArK^
08-11-2007, 09:41
però la versione iterativa è MOOOLTO + efficiente :p
la versione ricorsiva ha complessità esponenziale, quella iterativa lineare :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.