Fibonacci Memoized / Dynamic Programming in Java

时间:2017-04-30 16:25:59

标签: java recursion dynamic-programming fibonacci memoization

所以这是用记忆计算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];
}

1 个答案:

答案 0 :(得分:1)

因为fib(i)应该返回0的唯一情况是当i = 0时,那么测试if (memo[i] == 0)是正确的---它永远不会被调用一个值,其中0是一个模糊的结果,因为函数的第一行:if (i == 0

注意我认为更令人费解的是为什么在包装器调用中创建了memoization数组?是的,memoization保存了给定调用的计算,但是在连续调用函数之间所有优化都会丢失。