F(n)=F(n-1)+F(n-2)
首先想到的递归:
if(n<=1) return n; else return Fibonacci(n-1)+Fibonacci(n-2);
但是这个方法会造成多次重复计算,导致超时。例如
Fibonacci(4) = Fibonacci(3) + Fibonacci(2); = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0); = Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
第二种方法,迭代:
int Fibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; int numfn1 = 0, numfn2 = 1; int currentnum; for(int i=2; i<=n; ++i) { currentnum = numfn1+numfn2; numfn1 = numfn2; numfn2 = currentnum; } return currentnum; }
第三种方法,动态规划,例如解决跳台阶问题:
int Fibonacci(int n) { int f=1;g=2; n--; while(n--){ g+=f; f=g-f; } return f; }