我正在学习动态规划的斐波那契数列的应用程序,并有一个问题。下面是引用代码:动态规划斐波那契数列
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]
等于前两个元素的总和更有效率?
甚至检查为空或重新计算dp [i]是否更有效? @ElliottFrisch –
基准你的代码。但这不是一个递归算法,你的memoization不会帮助。 –
也许我不明白你的问题,但首先检查值会更有效率,而不是总是重新计算 - 至少对于大型输入。这不就是动态规划的全部重点吗? – 121c