2015-12-21 94 views
3

我想在Rosalind頁面上成功完成this challenge。挑戰是:申請斐波那契,使用大數

鑑於:正整數n≤40k≤5

回報:如果我們從1對開始,在每個世代中,將會在n個月後出現的兔子對的總數,每對繁殖年齡兔子產生一對k兔子對(而不是僅1對)。

該練習給出了兩個數字的文本文件,上面提到的nk

我的代碼試圖實現斐波那契,如預期的那樣在較短的月數內工作。然而,結果開始變得非常大,爲更高的月份,並在每種情況下,我被給予,我的回答是Infinity

我的公式應用不正確?或者,JavaScript是這種練習使用的不恰當的語言選擇?

我的代碼:

function fibonacciRabbits(months, pairs){ 

    var months = months; 
    var numberOfPairs = pairs; 
    var result = 0; 

    // Declare parent & child arrays with constants 
    var parentArr = [1, numberOfPairs + 1] 
    var childArr = [numberOfPairs, numberOfPairs] 

    var total = [] 

    // Loop from the point after constants set above 
    for(var i = 2; i < months - 2 ; i++){ 
     parentArr.push(parentArr[i-1] + childArr[i-1]) 
     childArr.push(parentArr[i-1] * childArr[i-2])  
     total.push(parentArr[i-1] + childArr[i-1]) 
    } 

    result = childArr[childArr.length - 1] + parentArr[parentArr.length - 1] 

    console.log(months + ' months and ' + numberOfPairs + ' pairs:\n') 
    console.log('parentArr:\n', parentArr) 
    console.log('childArr:\n', childArr) 
    console.log('total\n', total) 
    console.log('result:', result) 
    console.log('\n\n\n') 
} 

fibonacciRabbits(5, 3) 
fibonacciRabbits(11, 3) 
fibonacciRabbits(21, 3) 
fibonacciRabbits(31, 2) 

這裏是一個REPL

+0

只要任何數字大於約1.79E + 308,就會失敗:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE – davejagoda

+0

我是不知道我理解你的問題,所以對你的算法沒有意見;但如果你的問題是處理大數字,你可能想看看這裏:https://stackoverflow.com/questions/3072307/what-is-the-standard-solution-in-javascript-for-handling-big -numbers-bignum(JS在這方面確實有限,但幾乎所有語言都是:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE) – phtrivier

+0

python [https://www.python.org/dev/peps/pep-0237/]和ruby [http://patshaughnessy.net/2014/1/9/how-big-is-a-bignum]都可以處理這個特定的情況,而不用擔心達到某個最大整數。 – davejagoda

回答

1

這裏是不會產生這麼大的數字更簡單的解決方案,並處理最大的情況下,沒有擊中在Javascript無窮大。我認爲你的解決方案太快太快了。

function fibonacciRabbits(months, reproAmount){ 

    var existingAdults = 0; 
    var adultPairs = 0; 
    var childPairs = 1; 

    for(var i = 2; i <= months; i++){ 
     adultPairs = childPairs;  //children mature 
     childPairs = (existingAdults * reproAmount); //last month's adults reproduce 
     existingAdults += adultPairs; //new adults added to the reproduction pool 
    } 

    console.log(existingAdults + childPairs); 
} 

要確保你是在正確的軌道上,以測試你的功能:

fibonacciRabbits(1, 1); 
fibonacciRabbits(2, 1); 

從網站說:F(1)= F(2)= 1。所以無論如何這些都應該產生「1」。你的代碼爲這兩個產生「3」。