关于“古典问题:有⼀对兔⼦,从出⽣后第3个⽉起每个⽉都⽣⼀
对兔⼦……”理清问题,⽆往⽽不胜
被⼀窝兔⼦绊倒!
古典问题:有⼀对兔⼦,从出⽣后第3个⽉起每个⽉都⽣⼀对兔⼦,⼩兔⼦长到第三个⽉后每个⽉⼜⽣⼀对兔⼦,假如兔⼦都不死,问每个
⽉的兔⼦总数为多少?
本⼈是在搜问题时,发现有伙伴在百度提问,并试着理解并寻找问题发⽣的根源——误解了题⽬,还是解题困难。通过接受和理解问题提
出者的困惑后,发现疑惑和误解是可以理解的,我试着为题⽬增加⼀些限制和说明,使得对题⽬的把握更加准确,或者说减少题⽬本⾝存在
的歧义,使之更加明确。⾄于问题的解法,⽅法有多种,⽽且提供解法的⽂章数不胜数,不再赘述,如需了解,请再简单搜索⼀下。
(百度问题:.如果您看到这两处的说法⼀样,不要奇怪,都出⾃于本⼈。其中内容包括问题的直接回答,及对其中⼀个回答者的内容进⾏评
论,即回答了其中⼀个回答者的回复)
题⼲分析(减少歧义):不可将“第3个⽉”看成了(理解成)“隔3个⽉”。准确的理解是“如当下是1⽉初,2⽉初则是第⼆⽉,3⽉初就是第
三个⽉”。这⾥如果说成两⽉即61天(2个⽉,忽略闰⼆⽉,假如闰⼆⽉时,按⽉算)后。这样会减少不是歧义。
问题解析:这是⼀个典型的“波⾮那切数列”:前⾯相邻两项之和,构成了后⼀项(即:后⼀项,总等于前两项之和)。
关于:“前⾯相邻两项之和,构成了后⼀项”的理解:(
依据:“第3个⽉起每个⽉都⽣⼀对”(这⾥容易造成误解的是,第3个⽉起,这个起始时间点,是指⽉初还是⽉末的问题,从这个经典问题的
初衷来说,是指的⽉初)。
因此:“第3个⽉,即隔2个⽉(约61天,闰⽉则忽略并按⽉来算)就发⽣”。
结论:
(1)上⼀个⽉的兔⼦(n),在下⼀个⽉,保持到下⼀⽉(n);即⽼兔数=上⽉兔⼦总数。
(2)第3⽉出⽣的兔仔,由上上⽉(第前3⽉)的兔⼦所⽣,且是1对⽣1对,1:1的⽐例。及兔仔数=上上⽉的兔⼦总数。
(3)总数=上⽉兔⼦总数+上上⽉的兔⼦总数(也即相邻两项之和)
个⼈的⼀段⼩解法:
(1)迭代算法⽅式
tirver;
2
3publicclassrver{
4
5//11235
6publicstaticvoidmain(String[]args){
7intmonth;
8for(inti=1;i<10;i++){
9month=i;
10intcount=printCountByMonth(month);
n("第"+month+"⽉,⼩兔数为:"+count+"(对)");
n();
13}
14}
15
16publicstaticintprintCountByMonth(intmonth){
17if(month<1)thrownewRuntimeException("⽉数不可⼩于1个⽉");
18intfirst=1;
19intcond=1;
20intthird=0;
21if(month==1||month==2)return1;
22booleanflag=true;
23while(month>0){
24first=cond;
25cond=third;
26third=first+cond;
27month--;
28if(flag){
29flag=fal;
30}el{
(",");
32}
(third);
34}
n();
36returnthird;
37}
38}
运⾏结果:
第1⽉,⼩兔数为:1(对)
第2⽉,⼩兔数为:1(对)
1,1,2
第3⽉,⼩兔数为:2(对)
1,1,2,3
第4⽉,⼩兔数为:3(对)
1,1,2,3,5
第5⽉,⼩兔数为:5(对)
1,1,2,3,5,8
第6⽉,⼩兔数为:8(对)
1,1,2,3,5,8,13
第7⽉,⼩兔数为:13(对)
1,1,2,3,5,8,13,21
第8⽉,⼩兔数为:21(对)
1,1,2,3,5,8,13,21,34
第9⽉,⼩兔数为:34(对)
Processfinishedwithexitcode0
(2)递归算法⽅式
1publicclassBFNQFun{
2publicstaticvoidmain(String[]args){
3intin=9;
4intcount=getCount(in);
n();
n("in="+in+",getCount="+count);
7}
8
9publicstaticintgetCount(intin){
(in+",");
11if(in<=0)return1;
12if(in==1)return1;
13returngetCount(in-1)+getCount(in-2);
14}
15}
运⾏结果:(为了便于阅读,对下⾯的换⾏是⼿动修改的,并⾮原样,但数据总数不变)
9,8,7,6,5,4,3,2,1,0,1,2,1,0,3,2,1,0,1,4,3,2,1,0,1,2,1,0,
5,4,3,2,1,0,1,2,1,0,3,2,1,0,1,6,5,4,3,2,1,0,1,2,1,0,3,2,
1,0,1,4,3,2,1,0,1,2,1,0,7,6,5,4,3,2,1,0,1,2,1,0,3,2,1,0,
1,4,3,2,1,0,1,2,1,0,5,4,3,2,1,0,1,2,1,0,3,2,1,0,1,
in=9,getCount=55
⼩结:
从打印的“,”符号统计:
迭代算法:35个“,”.
递归算法:108个“,”.
即可得出:效率递归算法弱与迭代算法,也就是说,本次运算中递归算法优于迭代算法。
本文发布于:2023-01-24 04:45:58,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/124899.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |