Omdat in vele talen, een int standaard de waarde 0 krijgt.
Laat het nu net zo zijn dat dit in c/c++ niet gebeurt. De initialisatie gebeurt zoals rogier zei in de volgende functie aanroep.
Omdat in vele talen, een int standaard de waarde 0 krijgt.
Wablief? Nou is het voorbeeld van TS nogal een lelijke functie, maar als je vindt dat recursie om problemen vraagt, zou ik graag een 'minder problematische' oplossing zien dan:Evil Lathander schreef:Waarom roept die methode zichzelf op?
Dat is om problemen vragen.
Code: Selecteer alles
int Fibonacci( int n )
{
if (n<3) return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
(off-topic opmerking:Bv de snelste sorteeralgoritmes voor tabellen gebruiken recursie.
Precies, en tenzij de recursie-relatie heel simpel is (zoals in het geval van faculteiten bijvoorbeeld, daar is een for-loop wel wat efficienter dan een recursieve functie) maak je de boel alleen maar warrig door het helemaal uit te programmeren. Terwijl in de praktijk nog steeds hetzelfde rekenwerk gedaan wordt.Je kan recursie altijd zelf gaan simuleren met code maar dat zal nauwelijks effectiever zijn dan te doen aan de hand van functies die zichzelf oproepen.
(off-topic opmerking:Verborgen inhoud)
Persoonlijk vind ik dat je best lussen gebruikt om zoiets te doorwerken. Dan kan je er op de koop toe nog eens bij instellen hoe ver je wil gaan.
Wablief? Nou is het voorbeeld van TS nogal een lelijke functie, maar als je vindt dat recursie om problemen vraagt, zou ik graag een 'minder problematische' oplossing zien dan:
Code: Selecteer alles
int Fibonacci( int n )
{
if (n<3) return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
Code: Selecteer alles
#include <math.h>
int Fibonacci( int n )
{
static const double s5 = sqrt(5);
return int((pow(1+s5,n)-pow(1-s5,n))/(pow(2,n)*s5));
}
Leuke methode. Ik neem aan dat op die matrix dan handiger geschreven wordt zodat die n-de macht makkelijker wordt?PeterPan schreef:Dé manier om efficient\(F_n\)te berekenen (\({\cal O}(\log(n))\))
is door gebruik te maken van de volgende formule
\(\left(\begin{array}{cc}F_{n+1} & F_n \\F_n & F_{n-1} \end{array} \right) = \left(\begin{array}{cc}1 & 1 \\1 & 0 \end{array} \right)^n\)
Vandaar dePeterPan schreef:De tweede code is (al lijk dat wel zo) niet gechikt.
De rekentijd lijkt van orde\(\log(n)\)te zijn, maar is dat niet.
Door afrondfouten moeten steeds meer decimalen meegenomen worden.
Ik ben toch wel benieuwdPeterPan schreef:Het gaat niet om het aantal digits. Dat is niet relevant.
Het gaat om de berekening van\(\sqrt{5}\)in zijn decimalen.
Door de afronding van dit getal en het verheffen van dat getal tot grote machten spelen de afrondingen een zodanige rol dat er steeds meer decimalen nodig zijn. De theorie daaromtrent is iets te veel van het goede om hier precies uit de doeken te doen.
Ah, niceHier de pseudocode: