циклы — C ++ программа для кроликов, которые умирают

Вот мое назначение:

Пара новорожденных кроликов (один самец, одна самка) помещается в поле. Кролики способны к спариванию в возрасте одного месяца, так что в конце второго месяца каждая пара производит две новые пары кроликов, а затем умирает.

Примечание: в месяце 0, есть 0 пар кроликов. В 1 месяце 1 пара кроликов.

  1. Напишите программу — используя цикл while — который занимает количество месяцев у пользователя и
    печатает количество пар кроликов в конце этого месяца.
  2. В том же файле cpp напишите рекурсивную функцию rabbits (), которая принимает количество месяцев как
    Ввод и возвращает количество пар кроликов в конце этого месяца.
  3. В основной программе вызовите функцию rabbits () с номером, который ввел пользователь. Выход
    оба вычисления (то есть тот, который вы получили с помощью цикла и тот, который рекурсивный
    функция возвращает) и посмотреть, равны ли они.

и это то, что я получил до сих пор самостоятельно. (моя программа дает сбой, хотя при использовании чисел выше 3. по сути, я хочу знать, отвечаю я на вопрос или нет.

#include < iostream >

using namespace std;

int rabbits(int month); //declaring function

//begin program

int main ()
{
//defining variables
int  month, counter = 0, rab_now = 0, rab_lastmonth = 1, rab_twomonthsago = 0;
cout << "Please enter a month.";
cin >> month;

//start loop
while (counter <= month - 1)
{
rab_now = rab_lastmonth + (2*rab_twomonthsago); //doubles the birthrate of the rabbits
rab_twomonthsago = rab_lastmonth;
rab_lastmonth = rab_now -rab_lastmonth; //accounts for the death of parent rabbits
counter++;
}

cout << "According to the while loop, there are " << rab_now << " pair(s) of rabbits at the end of month " << counter << endl;
cout<< "According to the recursive function, there are "<< rabbits(month)<<" pair(s) of rabbits at the end of month "<<counter<<endl;

return 0;
}

int rabbits(int month)
{
if (month==0)
{
return 0;
}
else if (month==1)
{
return 1;
}
else if (month==2) // so as not to double 0 in the else below.
{
return 2;
}
else
{
return rabbits((month-2)*2); //since the population doubles every second month
}
}

1

Решение

Похоже, это переполняет стек за 4 месяца.

return rabbits((month-2)*2);

означает, что вызов rabbits(4) приведет к рекурсивному вызову rabbits(4), Каждый вызов потребляет небольшое количество стека и будет продолжаться до тех пор, пока в итоге стек не переполнится.

Вы хотели использовать

return 2 * rabbits(month-2);

здесь вместо этого? Это было бы более согласуется с комментарием в конце строки.

4

Другие решения

ты хочешь сказать

return fibonacci(n-1) + fibonacci(n-2);

0

По вопросам рекламы [email protected]