C# 算兔子的算法 要求用递归

 

C# 算兔子的算法 要求用递归,面试题

有一网友,在百度知道寻问一道面试题,题目如下:

一对小兔子一年后长成大兔子;一对大兔子每半年生一对小兔子。大兔子的繁殖期为4年,兔子的寿命是6年。假定第一年年初投放了一对小兔子,试编程计算,第n年末总共会有多少对兔子。n由键盘输入。(用递归哦,谢谢!)

----------------------------------------------------------

于是我先写出了解题思路,如下:

/ *           小兔子                                大兔子                                                    生育
  *1年           1                            
  *2年          0                                 1(1岁)    
  *2.5         1(第二代)                         1(1.5岁)                                            第一代1次
  *3           1(第二代0.5岁)+1(第三代)           1(2岁)                                               第一代2次
  *3.5         1(第三代0.5岁)+1(第四代)           1(第一代2.5岁)+1(第二代1岁)                            第一代3次
  *4           1(第四代0.5岁)+2(第五代)           1(第一代3岁)+1(第二代1.5岁)+1(第三代1岁)                第一代4次,第二代1次
  *4.5         2(第五代0.5岁)+2(第六代)           1(第一代3.5岁)+1(第二代2岁)+1(第三代1.5)+1(第四代1岁)    第一代5次第二代2次,第三代1次
  *5                                            1(第一代4岁)6次
  *5.5                                          1(第一代4.5)7次
  *6                                            1(第一代5岁)8次,已繁殖了4年
  *6.5                                          1(第一代5.5岁)
  * 
  * 
*/

我数学不太好,这是用笨方法列出来的,找出来了其规律及逻辑要点。于是我编写出了下述代码。

01using System;
02using System.Collections.Generic;
03  
04namespace zuo_TestProject{
05  
06    #region "主程序"
07    publicclassTestMain{
08        staticvoidMain(){
09            Tag:
10            Console.Write("请输入要测试的年数:");
11            stringSinput = Console.ReadLine();
12            doubledyear;
13            if(double.TryParse(Sinput,outdyear)){
14                Farms fs =newFarms();
15                intcount = fs.GetNum(dyear);
16                Console.WriteLine("\r\n{0}年以后兔子的对数为:{1}",dyear,count);
17            }
18            else{
19                Console.WriteLine("\r\n您输入的有误\r\n");
20                gotoTag;
21            }
22        }
23    }
24    #endregion          
25      
26    #region "兔子养殖场"
27    publicclassRabbit //兔子
28    {
29        privateintrabbit_Type;   //第几代
30        privatedoubleage; //年龄
31          
32        publicRabbit(intdai){
33            this.rabbit_Type = dai;//根据递归次数设置是第几代兔子,同代的兔子寿命相同,生育次数也相同
34        }
35          
36        publicintRabbitType{  //供外部查询是第几代兔子
37            get{returnthis.rabbit_Type; }
38        }
39          
40        publicdoubleAge{  //兔子年龄
41            get{returnthis.age; }
42            set{this.age = value; }
43        }       
44          
45    }
46      
47    publicclassFarms  //养殖场
48    {
49        privateintera = 1;    //第1代开始
50        privateList<Rabbit> rlst;   //用于存放兔子的列表
51        privatedoublestartTime;  //起始时间,默认0
52          
53        publicFarms(){
54            rlst =newList<Rabbit>();
55            rlst.Add(newRabbit(this.era));//养殖场初始只有第一代兔子
56        }
57          
58        publicintGetNum(doublenYear){   //返回N年之后有多少对兔子
59            if(nYear-this.startTime<=0.0){  //到达指定年限
60                returnrlst.Count; //返回有多少对兔子
61            }
62                      
63            Console.WriteLine("当前年份:{0}",this.startTime);
64                                      
65            List<Rabbit> nrs = rlst.FindAll(r=>r.Age>=1.5&&r.Age<5.5);  //返回满足可生育的兔子
66              
67            if(nrs.Count>0){//如果有符合生育条件的兔子
68                this.era++;//代数自增              
69            }
70            for(inti=0;i<nrs.Count;i++){
71                Console.WriteLine("------谁生了:第{0}代,当前寿命{1}",nrs[i].RabbitType,nrs[i].Age);
72                rlst.Add(newRabbit(this.era));//添加出生的小兔子
73            }
74            nrs.Clear();   //本次清空
75              
76            intkillNum = rlst.RemoveAll(r=>r.Age>=6.0);//等于6岁或超过6岁者,自然而然死!
77            Console.WriteLine("========当前生亡数量:{0}",killNum);
78            Console.WriteLine("========当前存活数量:{0}",rlst.Count);
79              
80            this.startTime += 0.5; //年自增
81            foreach(Rabbit rtinrlst){
82                rt.Age+=0.5;   //年龄增加半年                
83            }
84            returnGetNum(nYear);  //递归调用,返回结果值
85        }
86    }
87    #endregion
88}

 

这个小题挺有意思,一开始编的时候竟然盲目的想用几个变量就解决此题,当时还一根筋的用了个数学公式,结果仔细一想不对,于是又用笨方法推理出来了整个过程,所以才编写出来了这段代码,特分享给众位朋友,其实我也想知道还有没有更简洁的写法,由于我水平有限,只能想到这个了,分享的同时,也想换大家点更优秀的代码,看看有没有更加优质的代码能写出替代的小程序。恭候大家跟贴优秀代码、优秀算法。

下面是程序运行测试的结果:

请输入要测试的年数:7
当前年份:0
=======当前生亡数量:0
=======当前存活数量:1
当前年份:0.5
=======当前生亡数量:0
=======当前存活数量:1
当前年份:1
=======当前生亡数量:0
=======当前存活数量:1
当前年份:1.5
-----谁生了:第1代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:2
当前年份:2
-----谁生了:第1代,当前寿命2
=======当前生亡数量:0
=======当前存活数量:3
当前年份:2.5
-----谁生了:第1代,当前寿命2.5
=======当前生亡数量:0
=======当前存活数量:4
当前年份:3
-----谁生了:第1代,当前寿命3
-----谁生了:第2代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:6
当前年份:3.5
-----谁生了:第1代,当前寿命3.5
-----谁生了:第2代,当前寿命2
-----谁生了:第3代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:9
当前年份:4
-----谁生了:第1代,当前寿命4
-----谁生了:第2代,当前寿命2.5
-----谁生了:第3代,当前寿命2
-----谁生了:第4代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:13
当前年份:4.5
-----谁生了:第1代,当前寿命4.5
-----谁生了:第2代,当前寿命3
-----谁生了:第3代,当前寿命2.5
-----谁生了:第4代,当前寿命2
-----谁生了:第5代,当前寿命1.5
-----谁生了:第5代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:19
当前年份:5
-----谁生了:第1代,当前寿命5
-----谁生了:第2代,当前寿命3.5
-----谁生了:第3代,当前寿命3
-----谁生了:第4代,当前寿命2.5
-----谁生了:第5代,当前寿命2
-----谁生了:第5代,当前寿命2
-----谁生了:第6代,当前寿命1.5
-----谁生了:第6代,当前寿命1.5
-----谁生了:第6代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:28
当前年份:5.5
-----谁生了:第2代,当前寿命4
-----谁生了:第3代,当前寿命3.5
-----谁生了:第4代,当前寿命3
-----谁生了:第5代,当前寿命2.5
-----谁生了:第5代,当前寿命2.5
-----谁生了:第6代,当前寿命2
-----谁生了:第6代,当前寿命2
-----谁生了:第6代,当前寿命2
-----谁生了:第7代,当前寿命1.5
-----谁生了:第7代,当前寿命1.5
-----谁生了:第7代,当前寿命1.5
-----谁生了:第7代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:40
当前年份:6
-----谁生了:第2代,当前寿命4.5
-----谁生了:第3代,当前寿命4
-----谁生了:第4代,当前寿命3.5
-----谁生了:第5代,当前寿命3
-----谁生了:第5代,当前寿命3
-----谁生了:第6代,当前寿命2.5
-----谁生了:第6代,当前寿命2.5
-----谁生了:第6代,当前寿命2.5
-----谁生了:第7代,当前寿命2
-----谁生了:第7代,当前寿命2
-----谁生了:第7代,当前寿命2
-----谁生了:第7代,当前寿命2
-----谁生了:第8代,当前寿命1.5
-----谁生了:第8代,当前寿命1.5
-----谁生了:第8代,当前寿命1.5
-----谁生了:第8代,当前寿命1.5
-----谁生了:第8代,当前寿命1.5
-----谁生了:第8代,当前寿命1.5
=======当前生亡数量:1
=======当前存活数量:57
当前年份:6.5
-----谁生了:第2代,当前寿命5
-----谁生了:第3代,当前寿命4.5
-----谁生了:第4代,当前寿命4
-----谁生了:第5代,当前寿命3.5
-----谁生了:第5代,当前寿命3.5
-----谁生了:第6代,当前寿命3
-----谁生了:第6代,当前寿命3
-----谁生了:第6代,当前寿命3
-----谁生了:第7代,当前寿命2.5
-----谁生了:第7代,当前寿命2.5
-----谁生了:第7代,当前寿命2.5
-----谁生了:第7代,当前寿命2.5
-----谁生了:第8代,当前寿命2
-----谁生了:第8代,当前寿命2
-----谁生了:第8代,当前寿命2
-----谁生了:第8代,当前寿命2
-----谁生了:第8代,当前寿命2
-----谁生了:第8代,当前寿命2
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
-----谁生了:第9代,当前寿命1.5
=======当前生亡数量:0
=======当前存活数量:84

年以后兔子的对数为:84

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值