2

几天前我在这里问了一个关于这个兔子程序的问题,我几乎完成了它。问题是当我输入 0 时,它会崩溃并且无法运行。有人可以帮帮我吗,这是我的任务:

一对刚出生的兔子(一公一母)被放在一块田地里。兔子可以在一个月大的时候交配,所以在第二个月末,每对兔子都会生出两对新兔子,然后死去。注:第 0 个月有 0 对兔子。第 1 个月,有 1 对兔子。

  1. 编写一个程序 - 使用 while 循环 - 从用户那里获取月数,并在该月末打印兔子对的数量。
  2. 在同一个 cpp 文件中,编写一个递归函数 rabbits(),它将月数作为输入,并返回该月末的兔子对数。
  3. 在主程序中,使用用户输入的数字调用函数 rabbits()。输出两个计算(即,您使用循环获得的计算和递归函数返回的计算)并查看它们是否相等。

#include <iostream>
using namespace std;

int rabbits (int);

int main ()

{
int month_function, month_while, result_rec, result_while, counter = 0, rab_now, rab_lastmonth = 0, rab_twomonthsago = 1;

cout << "Please enter the month. \n\n";
cin >> month_function;
month_while = month_function;
cout << "\n";

if (month_function % 2 == 0) // if month entered is even, the recursive function will use month - 1 because the total number of rabbits doubles every other month
{
    month_function--;
}

result_rec = rabbits (month_function);

while (counter < month_while)
{
    if (counter % 2 == 0)
    {
    rab_now = rab_lastmonth + rab_twomonthsago;
    rab_lastmonth = rab_now;
    rab_twomonthsago = rab_now;
    }
    counter++;
    result_while = rab_lastmonth;
}

cout << "According to the recursive function, there are " << result_rec << " pairs of rabbits at the end of month " << month_while << "\n\n";

cout << "According to the while loop, there are " << result_while << " pairs of rabbits at the end of month " << month_while << endl;

if (result_rec = result_while)
{
    cout << "\n";
    cout << "They are equal!" << endl;
}
else
{
    cout << "They are not equal!" << endl;
}

return 0;
}

int rabbits (int month_function)

{
    if (month_function == 0)
    {
        return 0;
    }
    else if (month_function == 1)
    {
        return 1;
    }
    else
    {
       return (rabbits (month_function - 2) + rabbits (month_function - 2));
    }
}
4

3 回答 3

3

你的问题在这里:

if (month_function % 2 == 0) // if month entered is even, the recursive function will use   month - 1 because the total number of rabbits doubles every other month
{
    month_function--;
}

如果输入 0,则计算结果为 true,因此month_function等于-1

您(很可能)在您的逻辑中也存在错误。如果输入2月份函数,这将返回 0,这是错误的。考虑一下输入 2 应该得到什么答案,从那里修复应该相当容易。

于 2012-12-13T05:49:25.910 回答
2

当您输入时,0您会创建一个负数(条件if (month_function % 2 == 0)truefor month_function == 0)。当然后递归调用时rabbits(),您会创建一个相当深的递归,最终将超出堆栈并导致程序崩溃。可能您不想为非正值输入递归。

于 2012-12-13T05:48:22.173 回答
2

如果输入 0,则以下表达式的计算结果为 true

if (month_function % 2 == 0) 

所以month_function减为-1。

由于 -1,您的递归函数rabbits永远不会达到结束条件并导致堆栈溢出。

于 2012-12-13T05:48:56.003 回答