应用Fibonacci,处理大量数据

时间:2015-12-21 17:19:53

标签: javascript math numbers fibonacci

我正在尝试在Rosalind页面上成功完成this challenge。挑战是:

  

给定:正整数n≤40k≤5

     

返回:如果我们从1对开始n个月后将出现的兔子对的总数,并且在每一代中,每对生殖年龄的兔子产生一窝k兔子对(而不是只有一对)。

该练习提供了两个数字的文本文件,即上面提到的nk

我的代码试图实现Fibonacci,可以按照预期的更少数月运行。但是,对于更高的月份,结果开始变得非常大,并且在每种情况下我给出了,我的答案是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

1 个答案:

答案 0 :(得分: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”。