Salve a tutti!
Credo di aver scritto un programma sbagliato. La mia teoria per spiegare quello che vedo è che non so abbastanza dei compilatori per capire cosa succede davvero. Non credo insomma che il valore venga davvero calcolato ogni volta, ma che ci sia una sorta di scorciatoia da qualche parte che non vedo.
Io ho scritto per caso questo codice, ancora due anni fa, per calcolare la sequenza di fibonacci. (Non era proprio identico perchè era in pascal, oggi l'ho portato a C++)
codice:
char index = 42;
long a = 1;
long b = 0;
for (char i = 1; i < index; a += b, b = a - b, i++);
cout << a;
Questo come alternativa al tradizionale metodo ricorsivo in cui si ha una cosa tipo
codice:
if (index < 2) return 1;
else return fib(index - 1) + fib(index - 2);
Il secondo metodo, quello ricorsivo, è basato sulla definizione, ma se ragionate un filo su quello che ho scritto io, anche il mio fa le stesse cose. Il punto è che il mio codice risulta alcune centinaia di volte più veloce!!!
Provate per credere! per esempio, calcolate il 42 esimo numero usando entrambi i codici. E' così veloce che mi rifiuto di credere che funzioni davvero! Cioè no è impossibile, ci deve essere qualcosa che non ho considerato!!!
Qua sotto c'è il listato del programma, già pronto da compilare... Oo
codice:
#include <iostream>
using namespace std;
unsigned long int fib(char index);
unsigned long int fastfib(char index);
int main()
{
char ind = 42;
cout << "fastfib: ";
cout << fastfib(ind) << endl;
cout << "fib: ";
cout << fib(ind) << endl;
return 0;
}
unsigned long int fib(char index)
{
if (index == 1 || index == 2)
return 1;
else
return (fib(index-1) + fib(index-2));
}
unsigned long int fastfib(char index)
{
unsigned long int a, b;
a = 1;
b =0;
for (char i = 1; i < index; a+=b, b=a-b, i++);
return a;
}
:master: