2011-09-13 61 views
2

我砍死了一個遞歸函數中的Java在我的統計類家庭作業的問題,那看起來是這樣的:遞歸在Matlab和Java

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。

這已經整天被竊聽我,我絕對不知道爲什麼在兩種不同的語言兩種看似相同的節目都會給我完全不同的結果。任何人都可以解釋這個嗎?

回答

8

您的MATLAB程序可能工作浮點輸入,所以它會在浮點計算。

你的Java程序不具有整數類型; 6.1169e17超出支持的範圍,因此溢出。嘗試將您的類型更改爲floatdouble

+0

打我給它15秒! –

+0

Do'h ..同上: –

+0

謝謝,我不能相信我完全忘了! > _ < –

4

611692004959217300遠大於2147483647,它是Java中的整數MAX_VALUE

我在Firebug的運行

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)); 

611692004959217300

+2

+1 JavaScript是未來的語言..試想一下在瀏覽器中運行MATLAB :) – Amro

3

考慮一下最大值的int可以,這是你在Java中已經得到了什麼。現在考慮一下最大值a double可以有多大,這是MATLAB的默認類型。

3

的Java整數是4個字節大小,所以多少顯得過大(大於2^31時)。您應該再次使用「long」或「double」作爲變量的數據類型。