我正在學習動態規劃的斐波那契數列的應用程序,並有一個問題。下面是引用代碼:動態規劃斐波那契數列
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