7

生まれたばかりのウサギのペア(オス1匹、メス1匹)をフィールドに入れます。ウサギは1か月齢で交尾できるため、2か月目の終わりに、各ペアは2つの新しいウサギのペアを生成してから死亡します。

注:0か月目には、0組のウサギがいます。1か月目には、1組のウサギがいます。

  1. whileループを使用して、ユーザーから月数を取得し、その月の終わりにウサギのペアの数を出力するプログラムを作成します。

  2. 同じcppファイルに、月数を入力として受け取り、その月の終わりのウサギのペアの数を返す再帰関数rabbits()を記述します。

  3. メインプログラムで、ユーザーが入力した番号を使用して関数rabbits()を呼び出します。両方の計算(つまり、ループで取得した計算と再帰関数が返す計算)を出力し、それらが等しいかどうかを確認します。


説明はかなり自明です。私はすでにメインプログラム(通常のフィボナッチ機能)を停止していますが、繁殖後に死んでいくウサギを実装する方法がわかりません。隔月でうさぎの数が2倍になることはすでに知っていますが、どうやって実装すればいいのかわかりません。前もって感謝します。

#include <iostream>
using namespace std;

int rabbits (int);

int main ()
{
int x, month, result, counter = 0, rab_now, rab_lastmonth = 1, rab_twomonthsago = 0;

cout << "Please enter the month \n\n";
cin >> month;
cout << "\n";

result = rabbits (month);

while (counter <= month - 1)
{
      rab_now = rab_lastmonth + rab_twomonthsago;

      x = rab_lastmonth;
      rab_lastmonth = rab_now;
      rab_twomonthsago = x;

      counter++;
}

cout << "At the end of month " << month << ", there will be " << rab_lastmonth << "      
pairs of rabbits" << endl;

system("PAUSE");
return 0;
}

int rabbits (int month)

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

1 に答える 1

4

あなたの関数はほぼ正しいです、たった1つの些細な間違いがあります-おそらくタイプミス:

return (rabbits (month + 1) + rabbits (month - 2));

–翌月ではなく、前月ウサギが必要です。を:に変更+-ます

return (rabbits (month - 1) + rabbits (month - 2));

そして、そこに行きます。

ちなみに、その関数をより大きな月番号(20や30など)で呼び出してみてください。パフォーマンスに関して何か気づきましたか?特に反復的な実装と比較して?再帰関数をより効率的に実装する方法を考えられますか(頭の体操:これにアプローチする方法をすでに知っていない限り、これは簡単ではありません)。

于 2012-12-11T21:32:03.913 に答える