題目:輸出第 n 個斐波納契數(Fibonacci)
方法一、簡單遞歸
這個就不說了,小n怡情,大n傷身啊……當n=40的時候,就明顯感覺到卡了,不是一般的慢。
#include <iostream> Fibonacci( (n<=) Fibonacci(n-) + Fibonacci(n- (cin>> cout<<Fibonacci(n)<<
方案二、動態規劃
#include <iostream> #include <cstring> MAXN 300 Fibonacci( i++ F[]= F[]= (n<=) F[n]=Fibonacci(n-) + Fibonacci(n- (cin>> i= memset(F,, cout<<Fibonacci(n)<< cout<<<<i<<<<
【以上程序可以優化:既然只要求輸出第n個斐波納契數f(n),則只需用兩個變量記錄f(n-1)和f(n-2),不用開數組將整個1到n的斐波納契數列都記錄下來。】
最開始忘了 if(F[n]==0) 這個判斷(17行),導致了很多次的重復計算——和遞歸算法一樣多的次數。
以下是程序運行截圖,上圖為正確程序,下圖為漏掉了 if(F[n]==0) 這個判斷的錯誤程序。可以看出運行時間上的巨大差距:
當輸入n=100時,錯誤的程序很長很長一段時間內都還沒計算出來。
方法三、for循環 + 數組
速度也非常快。
#include <iostream> #include <cstring> MAXN 300 Fibonacci( F[]= F[]= (n<=) ( i=; i<n; ++ F[i] = F[i-] + F[i- F[n- (cin>> memset(F,, cout<<Fibonacci(n)<< }