题目描述:
输入:int n
输出:f(n)
其中:f(0) = 0;
f(1) = 1;
f(n) = f(n-1) + f(n-2) n>1;
思路:
- 最容易想到的是递归的形式:但是这种形式会重复的计算多次底层的值
- 第二种思路是先计算好底层的两个子节点数据,并且保存起来,在后面计算的时候直接使用,避免重复计算。
代码
public static int fibonacciNaive(int n) { // 最易于想到的递归方式,但由于重复计算效率较低,详情见书本第76页
if (n == 0)
return 0;
if (n == 1)
return 1;
return fibonacciNaive(n - 1) + fibonacciNaive(n - 2);
}
/*
第一种方法按照树的形状分析,会重复计算特别多次相同节点
第二种思路是先计算好底层的两个子节点数据,并且保存起来,在后面计算的时候直接使用,避免重复计算。
*/
public static int fibonacciBottomUp(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
// 初始的时候的状况是这样的。
int nMinusOne = 1;
int nMinusTwo = 0;
int result = 0;
// 循环次数的确定
// 2循环一次
// 3循环两次 ...
// ...
// n循环n-1次
for (int i = 0; i < n - 1; i++) {
result = nMinusOne + nMinusTwo;
nMinusTwo = nMinusOne;
nMinusOne = result;
}
return result;
}