这是我的作业:

将一对新生兔子(一只雄性,一只雌性)放在田里。兔子能够在一个月大的时候交配,因此在第二个月的月末,每对都会产生两对新的兔子,然后死亡。

注意:在第0个月中,有0对兔子。在第1个月,有1对兔子。

  • 使用while循环编写一个程序,该程序花费了用户几个月的时间,并且
    打印该月末的成对兔子数。
  • 在同一cpp文件中,编写一个递归函数rabbits(),将月数作为
    输入并返回该月末兔子的对数。
  • 在主程序中,使用用户输入的编号调用函数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
        }
    }
    

    最佳答案

    看来这使第4个月的堆栈溢出。

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

    意味着调用rabbits(4)将导致对rabbits(4)的递归调用。每个调用消耗少量堆栈,并且将继续进行直到堆栈最终溢出为止。

    你是说要用
    return 2 * rabbits(month-2);
    

    代替吗这与该行末尾的注释更加一致。

    10-01 20:08