PDA

View Full Version : Programma in C non va...potete controllare?


cecce88
07-11-2007, 22:22
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;
}

andbin
07-11-2007, 22:45
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.

thehuge
07-11-2007, 22:51
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....

geko.88
08-11-2007, 00:41
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