Java中的斐波那契记忆/动态规划

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),而不需要重新计算一堆值呢

这是一些用记忆法计算斐波那契序列的代码。让我困惑的是当我们检查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返回给调用函数