2015-12-21 4 views
3

Я пытаюсь успешно завершить this challenge на странице Rosalind. Задача состоит в следующем:Применение Фибоначчи, работа с большими числами

Дано: Положительные целые числа n≤40 и k≤5.

Возврат: Общее количество пар кроликов, которые будут присутствовать после n месяцев, если мы начинаем с 1 парой и в каждом поколении, каждая пара репродукции возраст кроликов производит помет k пара кроликов (вместо только 1 пар).

упражнение дает текстовый файл из двух чисел, n и k упоминалось выше.

Мой код, который пытается реализовать Фибоначчи, работает, как ожидается, на меньшее количество месяцев. Тем не менее, результат начинает становиться чрезвычайно большим для большего количества месяцев, и в каждом случае мне дают, мой ответ 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» для обоих из них.

Смежные вопросы