【发布时间】:2017-04-17 00:25:40
【问题描述】:
我正在学习动态规划在斐波那契数列中的应用,并且有一个问题。以下是参考代码:
import java.math.BigInteger;
import java.util.Arrays;
public class FibonacciNumbersB {
static BigInteger[] dp = new BigInteger[10000];
public static void main(String[] args) {
Arrays.fill(dp, BigInteger.ZERO);
dp[0] = BigInteger.ONE;
dp[1] = BigInteger.ONE;
for(int i = 4; i < 9999; i++)
System.out.println(fibRecurse(i).toString());
}
public static BigInteger fibRecurse(int N) {
for(int i = 2; i < N; i++) {
// For numerous calls to this function, this will save as it goes
if(dp[i].equals(BigInteger.ZERO))
dp[i] = dp[i - 1].add(dp[i - 2]);
}
return dp[N - 1];
}
}
我有一个语句检查dp[i] 是否在fibRecurse 方法中等于0(尽管fibRecurse 不是递归的)。
检查dp[i] 是否已经计算过或者让dp[i] 等于前两个元素的总和是否更有效?
【问题讨论】:
-
检查 null 或重新计算 dp[i] 是否更有效? @ElliottFrisch
-
对您的代码进行基准测试。但这不是递归算法,你的记忆也无济于事。
-
也许我不明白你的问题,但首先检查值会更有效,而不是总是重新计算 - 至少对于大量输入。这不就是动态规划的重点吗?
-
@Chris 哦,我明白了。感谢您的回复 - 这就是我想要的。
-
没问题。动态编程与其他一些“算法类型”非常相似。我认为这有点像分而治之,但是您将“子问题”保存到解决方案中,目的是可能重用它们。希望能有所帮助
标签: java dynamic-programming fibonacci