Dưới đây là một phương pháp trực tiếp thay thế Nó dựa trên một vài thuộc tính:
- Mỗi số Fibonacci có thể được tính trực tiếp dưới dạng sàn (pow (phi, n) + 0.5) (Xem tính toán bằng cách làm tròn trong http://en.wikipedia.org/wiki/Fibonacci_number). Ngược lại chỉ số của số Fibonacci lớn nhất nhỏ hơn i được cho bởi sàn (log (i * sqrt (5))/log (phi))
- Tổng của N số Fibonacci đầu tiên là số N + 2 1 (Xem Nhận dạng thứ hai trên cùng trang wikipedia)
- Các số Fibonacci đều là số thứ ba. (Nhìn vào chuỗi thứ tự 2 và kết quả là tầm thường)
- Tổng của các số Fibonacci thậm chí bằng một nửa tổng các số Fibonacci lẻ tới cùng một điểm trong chuỗi.
Point 4 có thể được nhìn thấy từ này:
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))
Vì vậy, chuyển đổi giá trị lớn nhất của chúng ta về 4000000 tính toán chỉ số của các số Fibonacci cao nhất ít hơn nó.
int n = floor(log(4000000*sqrt(5))/log(phi)); // (= 33)
33 chia hết cho 3 vì vậy đây là số Fibonacci ngay cả khi chúng tôi không cần điều chỉnh n như thế này.
n = (n/3)*3;
Tổng số tất cả các số Fibonacci đến thời điểm này nếu do
sum = floor(pow(phi, n+2) + 0.5) - 1; // (= 9227464)
Tổng của tất cả các số chẵn là một nửa của này:
sum_even = sum/2; // (= 4613732)
đẹp điều về việc này là rằng nó là một O (1) (hoặc O (log (N)) nếu bạn bao gồm các chi phí của pow/log) thuật toán, và hoạt động trên đôi ... vì vậy chúng tôi có thể tính toán tổng cho các giá trị rất lớn.
LƯU Ý: Tôi đã chỉnh sửa và chuyển câu trả lời này từ bản sao đã đóng của câu hỏi này. Fibonacci under 4 millions
Nguồn
2010-07-19 00:37:09
chính xác dupe: http://stackoverflow.com/questions/494594/how-to-write-the-fibonacci-sequence-in-python – Triptych
nên không phải là cơ thể định nghĩa được thụt? – Svante
Đã sửa. Khi chỉnh sửa, mọi thứ hiển thị chính xác, có vẻ như đó là một số lỗi định dạng SO. – schnaader