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歲)
  * 
  * 
*/

我數學不太好,這是用笨方法列出來的,找出來了其規律及邏輯要點。於是我編寫出了下述代碼。

01 using System;
02 using System.Collections.Generic;
03   
04 namespace 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

發佈了26 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章