1. アルゴリズム設計要件
最初の月に生まれたばかりのウサギのペアがあり、2 か月目に成熟し、3 か月目にウサギを産み始めるとします。そして、成熟したウサギのペアが毎月ウサギのペアを出産します。ウサギは決して死ぬことはありません... .それで、生まれたばかりのウサギ1組から始めて、12か月後には何組になるでしょうか?
2. 問題分析
分析のために生まれたばかりのウサギのペアを採取するのもよいでしょう。
最初の1ヶ月は、子うさぎ①には生殖能力がないので、まだつがいです。
2か月目、子うさぎ①は成熟期に入りますが、まだつがいがいます。
3 か月目にウサギ①が子ウサギ②を産んだので、今月は 2 組(1+1=2)のウサギが生まれます。
4ヶ月目に①のウサギがもう一組のウサギ③を産んだので、合計3組(1+2=3)のウサギがいます。
5ヶ月目にウサギ①がもう一組のウサギ④を産み、3ヶ月目に生まれたウサギ②もまたウサギのペア⑤を産み、2+3=5組のウサギがいます。合計で。
6ヶ月目、①②③のウサギがそれぞれ小さなウサギを1組ずつ生み、生まれたばかりの3組のウサギに元の5組のウサギを加えて、今月は8組(3+5=8)のウサギが生まれました。
表現を分かりやすくするために、生まれたばかりのウサギ、成熟したウサギ、繁殖中のウサギをそれぞれ図で表し、ウサギの繁殖過程を図に示します。
この系列には、次のような非常に明らかな特徴があります。3 か月目から、当月のウサギの数 = 前月のウサギの数 + 当月の生まれたばかりのウサギの数、そして、今年の生まれたばかりのウサギの数現在の月は、前月のウサギの数とまったく同じです。したがって、前に隣接する 2 つの項目の合計が後者の項目、つまり
当月のウサギの数 = 前月のウサギの数 + 前月のウサギの数を構成します
。次のように:
1、1、2、3、5、8、13、21、34、...
再帰式は次のとおりです。
3. アルゴリズム設計
#include<stdio.h>
int main() {
int n=12;
//前两次的值都为1
int s1 = 1;
int s2 = 1;
//前两个月
printf("%d \n", s1);
printf("%d \n", s2);
//m每次迭代记录单前的值,和上次的值。
for (int i = 3; i <= n; i++) {
s2 = s2 + s1; //当前的值
s1 = s2 - s1; //上次的值
printf("%d \n", s2);
}
return 0;
}