題目描述:寫出乙個函式,輸入n,求解菲波那切數列的第n項。
很多教材在講述遞迴函式(在乙個函式內部呼叫這個函式自身)時會使用fibonacci例子。
方法1:
**如下:
public static long fib(int n)
if(n==1)
return fib(n-1)+fib(n-2);
}思考:我們以求解f(10)為例。想要求得f(10),就得求得f(9)和f(8).同樣,想要求得f(9) 就得求f(8)和f(7)…我們不難發現這裡面有很多節點是重複計算的。
方法2
從下往上計算。首先根據f(0)、f(1)計算得到f(2)。再根據f(1)和f(2)計算得到f(3)。。。。以此類推就可以算出第n項了。**如下:
/**
* 優化的菲波那切數列
*/ public static long optimizefib(int n);
if(n<2)
long fibone = 1;
long fibtwo = 0;
long fibn = 0;
for(int i=2;i<=n;i++)
return fibn;
} 該思路的時間複雜度為o(n)…
n=50時,用傳統的方法耗時:1258626902582224ms
優化後的方法耗時為:125862690250ms
約為1w倍。所以說優化還是挺有必要!!!
題目二(舉一反三):乙隻青蛙一次可以跳上1個台階,也可以跳上2個台階。求該青蛙跳上乙個n級的台階總共有多少中做法。
分析:當n = 1 ,顯然只有1種跳法
當n = 2,有2中跳法。
當n = 3,有3中跳法。
以此類推。f(n) = f(n-1) + f(n-2);
**如下:
public static int jumpfloor(int target) ;
if(target<2)
int target1 = 1;
int target2 = 2;
int targetn = 0;
for(int i=2;i<=target;i++)
return targetn;
}
斐波那契數列及青蛙跳台階問題
都是 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。斐波那契 fibonacci 數列定義如下 f n 0,1,f n 1 f n 2 n 0n 1 n 2 效率很低的解法 遞迴解法 效率很低 long long fibonacci solution1 unsigned int ...
斐波那契數列及青蛙跳台階問題
題目1 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。斐波那契 fibonacci 數列定義如下 f n 0,1,f n 1 f n 2 n 0 n 1 n 2 效率很低的解法 遞迴解法 效率很低 objc view plain copy long long fibonacci ...
斐波那契數列及青蛙跳台階問題
題目1 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。1斐波那契 fibonacci 數列定義如下 效率很低的解法 遞迴解法 效率很低 function fibonacci solution1 n 2 迴圈解法 改進的演算法 從下往上計算。首先根據f 0 和f 1 算出f 2 再...