Fibonacci in C (deel 2)
Na nog wat proberen van Patrick Smits blijkt dat de functie nog korter kan.
unsigned long long fibonacci_list(int reset)
{
static unsigned long long a=0, b=0;
if (reset!=0) { a=0; b=0; }
return (((a+b)==0) ? a++ :
((b==0) ? (b+=a--) :
((a<b) ? (a+=b) : (b+=a))));
}
Of je er veel aan hebt is een tweede, wat blijkt, de meest simpele iterratieve implementatie is de snelste. Dit komt onder meer doordat ‘ifs’ duur zijn qua tijd, en omdat de simpele versie veel beter te optimaliseren is voor de compiler.
unsigned long long fibonacci_n(int n)
{
unsigned long long a = 0, b = 1, t;
int i;
if (n <= 0) { return (0); }
for (i = 0; i < (n - 1); i++)
{
t = b;
b = a + b;
a = t;
}
return (b);
}
Zie ook LiteratePrograms.
Maar dan blijft er nog 1 probleem over.. het getal wordt erg snel erg groot, en past dan niet meer in een ‘unsigned long long’. Dan kun je twee dingen doen.
Je kunt zelf iets verzinnen om te rekenen met grotere getallen, maar simpeler is het om een andere programmeer taal te gebruiken, zoals bijvoorbeeld Python.
Hoe meer geheugen je computer heeft, hoe grotere getallen je dan kunt uitrekenen, vrijwel net zo snel als in C.
Was alles maar zo eenvoudig op te lossen.

Recent Comments