[英]Recursion in Matlab vs Java
我在Java中修改了一個遞歸函數,用於我的Stats類中的作業問題,看起來像這樣:
public static int d (int k, int n) {
if (n == 1) return 1;
else if (n > k) return 0;
else return n*d(k-1, n) + n*d(k-1,n-1);
}
然后我將(20,8)插入此功能,並獲得了998,925,952。 然而,我的教授說這個答案是錯的,經過一遍又一遍地重新思考我的代碼后,我決定在Matlab中嘗試同樣的事情:
function t = d(k,n)
t = 0;
if n == 1
t = 1;
elseif n > k
t = 0;
else
t = n*d(k-1, n) + n*d(k-1, n-1);
end
顯然,這個功能給了我正確的答案,上面的輸入,6.1169 * 10 ^ 17。
這一直困擾着我,我完全不知道為什么兩種看似相同的兩種語言的程序會給我帶來完全不同的結果。 有人可以幫忙解釋一下嗎?
您的Matlab例程可能正在處理浮點輸入,因此它將以浮點計算。
您的Java例程具有整數類型; 6.1169e17超出了支持的范圍,因此溢出。 嘗試將您的類型更改為float
或double
。
611692004959217300
遠大於2147483647
,它是Java中的整數MAX_VALUE 。
我跑了611692004959217300
function d (k, n) {
if (n == 1) return 1;
else if (n > k) return 0;
else return n*d(k-1, n) + n*d(k-1,n-1);
}
console.log(d(20,8));
在Firebug中。
考慮一下int
可以擁有的最大值,這是你在Java中得到的。 現在考慮double
可以具有的最大值,這是MATLAB的默認類型。
Java整數大小為4個字節,因此數字看起來太大(大於2 ^ 31)。 您應該再次使用“long”或“double”作為變量的數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.