Ecco un metodo diretto alternativo Esso si basa su alcune proprietà:
- Ogni numero di Fibonacci può essere calcolato direttamente come floor (pow (phi, n) + 0.5) (Vedere Calcolo arrotondando http://en.wikipedia.org/wiki/Fibonacci_number). Viceversa l'indice del più grande numero di Fibonacci minore di I è dato da floor (log (i * sqrt (5))/log (phi))
- La somma dei primi numeri N Fibonacci è il numero N + 2 ° di fibonacci meno 1 (Vedi Seconda identità sulla stessa pagina di Wikipedia)
- I numeri pari di Fibonacci sono ogni terzo. (Guarda la sequenza mod 2 e il risultato è banale)
- La somma dei numeri pari di Fibonacci è la metà della somma dei numeri dispari di Fibonacci fino allo stesso punto della sequenza.
punto 4 può essere visto da questo:
Sum of first 3N fibonacci numbers
=(F(1) + F(2))+ F(3) +(F(4) + F(5))+ F(6) + ... +(F(3N-2) + F(3N-1))+ F(3N)
= F(3) + F(3) + F(6) + F(6) + ... + F(3N) + F(3N)
= 2(F(3) + F(6) + ... + F(3N))
= 2 (Sum of odd fibonacci numbers up to F(3N))
Quindi convertire il nostro valore massimo di 4000000 calcolare l'indice del più alto numero di Fibonacci meno di esso.
int n = floor(log(4000000*sqrt(5))/log(phi)); // (= 33)
33 è divisibile per 3, quindi è un numero pari di Fibonacci, se non fosse stato avremmo bisogno di regolare n come questo.
n = (n/3)*3;
La somma di tutti i numeri di Fibonacci fino a questo punto, se data dal
sum = floor(pow(phi, n+2) + 0.5) - 1; // (= 9227464)
La somma di tutti i numeri è la metà di questo:
sum_even = sum/2; // (= 4613732)
cosa bella di questo è che è un algoritmo O (1) (o O (log (N)) se si include il costo di pow/log) e funziona su doppio .. quindi possiamo calcolare la somma per valori molto grandi.
NOTA: ho modificato e spostato questa risposta da un duplicato chiuso di questa domanda. Fibonacci under 4 millions
fonte
2010-07-19 00:37:09
esatto vittima: http://stackoverflow.com/questions/494594/how-to-write-the-fibonacci-sequence-in-python – Triptych
dovrebbe non il corpo definizione essere rientrato? – Svante
corretto. Durante la modifica, tutto è apparso corretto, sembra che fosse un errore di formattazione SO. – schnaader