Java中的斐波那契记忆/动态规划
这是一些用记忆法计算斐波那契序列的代码。让我困惑的是当我们检查memo[i]==0时。我知道Java数组被初始化为零,因此如果memo[I]==0,这可能意味着memo[I]的计算尚未进行。但是,此斐波那契函数的返回值之一为0。那么这是否意味着如果fib(3)=0(我知道不是,只是为了论证),那么每次我们有fib(3),我们都会重新计算fib(3),因为检查是否(memo[I]==0)正确?如果是这样的话,为什么我们可以在这个特定的代码中使用if(memo[i]==0),而不需要重新计算一堆值呢Java中的斐波那契记忆/动态规划,java,recursion,dynamic-programming,fibonacci,memoization,Java,Recursion,Dynamic Programming,Fibonacci,Memoization,这是一些用记忆法计算斐波那契序列的代码。让我困惑的是当我们检查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];
}
由于fib(i)应该返回0的唯一情况是当i=0时,那么测试
if(memo[i]==0)
是正常的——因为函数的第一行:if(i==0
,所以对于0是不明确结果的值,永远不会调用它
注:我认为更令人费解的是,为什么在包装器调用中创建记忆数组?是的,记忆节省了给定调用的计算,但所有优化都在对函数的连续调用之间丢失。对于
I
的哪些值fib(I)==0
?fib(0)这是一个基本情况OK,那么当调用fibonacci(0,…)
时会发生什么呢?0返回给调用函数