javascript - 应用斐波那契数列,处理大数

标签 javascript math numbers fibonacci

我正在尝试成功完成 this challenge在罗莎琳德页面上。挑战是:

Given: Positive integers n≤40 and k≤5.

Return: The total number of rabbit pairs that will be present after n months if we begin with 1 pair and in each generation, every pair of reproduction-age rabbits produces a litter of k rabbit pairs (instead of only 1 pair).

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

关于javascript - 应用斐波那契数列,处理大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34401118/

相关文章:

javascript - 使用本地存储中保存的数据填充 HTML 表单

javascript - JQuery 动态元素如 TR 和 TD,添加到 HTML TABLE

c - 可以用相同的数字进行可能的组合

php - 为什么阿拉伯数字 (١٢٣) 在文本框中不被接受为实数?

c - 如何使这个 C 三角形数字生成器的数字居中?

javascript - Knex 中的链接查询/事务?

javascript - 表单不断抛出 "Direct Access to this page is not allowed."找不到Bug

algorithm - 在 log n 时间内解决类似斐波那契的递归问题

database - 对 uuid 进行模运算以确定 shard_id

python - 高维最近邻搜索和局部敏感性哈希