所以这是用记忆计算Fibonacci序列的一些代码。令我困惑的是当我们检查memo [i] == 0时。我知道Java数组被初始化为零,因此如果memo [i] == 0,这可能意味着memo [i]的计算尚未发生。然而,这个斐波纳契函数的返回值之一是0.所以这并不意味着让我们说如果fib(3)= 0(我知道它不是,但只是为了这个缘故) (每次我们有fib(3))我们最终会重新计算fib(3)因为检查是否(memo [i] == 0)对吗?如果是这种情况,为什么我们可以在这个特定的代码中使用if(memo [i] == 0)而不是重新计算一堆值?
int fibonacci(int n){
return fibonacci(n, new int[n+1]);
}
int fibonacci(int i, int[] memo) {
if(i == 0 || i == 1) return i;
if(memo[i] == 0){ //This line does not make sense to me
memo[i] = fibonacci(i - 1, memo) + fibonacci(i - 2, memo);
}
return memo[i];
}
答案 0 :(得分:1)
因为fib(i)应该返回0的唯一情况是当i = 0时,那么测试if (memo[i] == 0)
是正确的---它永远不会被调用一个值,其中0是一个模糊的结果,因为函数的第一行:if (i == 0
。
注意我认为更令人费解的是为什么在包装器调用中创建了memoization数组?是的,memoization保存了给定调用的计算,但是在连续调用函数之间所有优化都会丢失。