这是我的作业:
将一对新生兔子(一只雄性,一只雌性)放在田里。兔子能够在一个月大的时候交配,因此在第二个月的月末,每对都会产生两对新的兔子,然后死亡。
注意:在第0个月中,有0对兔子。在第1个月,有1对兔子。
打印该月末的成对兔子数。
输入并返回该月末兔子的对数。
两种计算(即您通过循环获得的结果和递归计算的结果
函数返回),看看它们是否相等。
这就是我到目前为止所取得的成就。 (虽然当我使用大于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
}
}
最佳答案
看来这使第4个月的堆栈溢出。
return rabbits((month-2)*2);
意味着调用
rabbits(4)
将导致对rabbits(4)
的递归调用。每个调用消耗少量堆栈,并且将继续进行直到堆栈最终溢出为止。你是说要用
return 2 * rabbits(month-2);
代替吗这与该行末尾的注释更加一致。