应用斐波那契,处理大数字

Applying Fibonacci, working with large numbers

本文关键字:处理 数字 应用      更新时间:2023-09-26

我正努力在Rosalind页面上成功完成这项挑战。挑战在于:

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

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

练习给出了一个包含两个数字的文本文件,即上面提到的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

这里有一个更简单的解决方案,它不会产生如此大的数字,并且在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"。