Fibonacci number/fi

From Lazarus wiki

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)

Fibonaccin lukujono koostuu numeroista:

 0, 1, 1, 2, 3, 5, 8, 13, 21, 

Ajatuksena on lisätä kaksi viimeistä numeroa yhteen, jolloin saadaan seuraava arvo.

Fibonaccin lukujonon luonti

Seuraavat toteutukset osoittavat Fibonacci-numeroiden laskentaperiaatteen. Siinä ei ole syötön valvontaa. Riippuen asetuksista voidaan luoda ajonaikainen virhe (esim. {$rangeChecks on} tai käyttämällä system.runError), nostaa (raise) poikkeus tai palauttaa väärä arvo, joka ilmaisee, että jokin meni pieleen.


Rekursiivinen toteutus

 3 type
 4 	/// domain for Fibonacci function
 5 	/// where result is within nativeUInt
 6 	// You can not name it fibonacciDomain,
 7 	// since the Fibonacci function itself
 8 	// is defined for all whole numbers
 9 	// but the result beyond F(n) exceeds high(nativeUInt).
10 	fibonacciLeftInverseRange =
11 		{$ifdef CPU64} 0..93 {$else} 0..47 {$endif};
12 
13 {**
14 	toteuttaa Fibonacci-sekvenssin rekursiivisesti
15 	
16 	\param n the index of the Fibonacci number to retrieve
17 	\returns the Fibonacci value at n
18 }
19 function fibonacci(const n: fibonacciLeftInverseRange): nativeUInt;
20 begin
21 	// optimization: then part gets executed most of the time
22 	if n > 1 then
23 	begin
24 		fibonacci := fibonacci(n - 2) + fibonacci(n - 1);
25 	end
26 	else
27 	begin
28 		// since the domain is restricted to non-negative integers
29 		// we can bluntly assign the result to n
30 		fibonacci := n;
31 	end;
32 end;

Iteratiivinen toteutus

Tämä on suositeltavampi sen ajonaikaisen käyttäytymisen suhteen.

13 {**
14 	toteuttaa Fibonacci-sekvenssin iteratiivisesti
15 	
16 	\param n the index of the Fibonacci number to calculate
17 	\returns the Fibonacci value at n
18 }
19 function fibonacci(const n: fibonacciLeftInverseRange): nativeUInt;
20 type
21 	/// more meaningful identifiers than simple integers
22 	relativePosition = (previous, current, next);
23 var
24 	/// temporary iterator variable
25 	i: longword;
26 	/// holds preceding fibonacci values
27 	f: array[relativePosition] of nativeUInt;
28 begin
29 	f[previous] := 0;
30 	f[current] := 1;
31 	
32 	// note, in Pascal for-loop-limits are inclusive
33 	for i := 1 to n do
34 	begin
35 		f[next] := f[previous] + f[current];
36 		f[previous] := f[current];
37 		f[current] := f[next];
38 	end;
39 	
40 	// assign to previous, bc f[current] = f[next] for next iteration
41 	fibonacci := f[previous];
42 end;

Huomioita

Fibonacci-numeroa laskettaessa joka kerta uudelleen, kun sitä tarvitaan, tarvitaan jonkin verran muistia ja se vie lisäksi aikaa. Sovellukset jotka luottavat voimakkaasti Fibonacci-numeroihin, käyttävät hakutaulukkoa. Sitä ei yleensä enää lasketa, mikä on jo tunnettu tosiasia. Koska Fibonacci-sekvenssi ei muutu, sen laskeminen on lähinnä opetusta, mutta sitä ei ole tarkoitettu tuotanto käyttöön.

Se miten se tuotannossa toteutetaan on kuitenkin jätetty pois tästä, koska jokainen tekee sen vähän eri tavalla.

Katso myös