我正在尝试在Rosalind页面上成功完成this challenge。挑战是:
给定:正整数
n≤40
和k≤5
。返回:如果我们从1对开始
n
个月后将出现的兔子对的总数,并且在每一代中,每对生殖年龄的兔子产生一窝k
兔子对(而不是只有一对)。
该练习提供了两个数字的文本文件,即上面提到的n
和k
。
我的代码试图实现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
答案 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”。