(兔子繁殖問題)有一對兔子,從出生後第3個月起每月都生一對兔子,小兔子長到三個月後每月又生一對兔子,假如兔子都不死,問32個月事後的兔子總數爲多少?

網上關於這個問題有不少人說這個符合斐波那契數列,可是我我的在推算的時候發現並非這樣的,因此想本身解決這個問題編程

 

創建一個兔子類this

屬性有ID,agespa

public class rabbit{對象

  public  $id;遞歸

  public  age;get

}數學

第1個月:(id=1,age=1)------------------------------------------------------------------------------------------------------------------------------------------------------------------1it

第2個月:(id=1,age=2)------------------------------------------------------------------------------------------------------------------------------------------------------------------1io

第3個月:(id=1,age=3)------------------------------------------------------------------------------------------------------------------------------------------------------------------1function

第4個月:(id=1,age=4)  (id=2,age=0)------------------------------------------------------------------------------------------------------------------------------------------------2          

第5個月:(id=1,age=5)  (id=2,age=1) (id=3,age=0)-------------------------------------------------------------------------------------------------------------------------------3

第6個月:(id=1,age=6)  (id=2,age=2) (id=3,age=1) (id=4,age=0)--------------------------------------------------------------------------------------------------------------4

第7個月:(id=1,age=7)  (id=2,age=3) (id=3,age=2) (id=4,age=1) (id=5,age=0)---------------------------------------------------------------------------------------------5

第8個月:(id=1,age=8)  (id=2,age=4) (id=3,age=3) (id=4,age=2) (id=5,age=1) (id=6,age=0) (id=7,age=0)-----------------------------------------------------------7

第9個月:(id=1,age=9)  (id=2,age=5) (id=3,age=4) (id=4,age=3) (id=5,age=2) (id=6,age=1) (id=7,age=1)(id=8,age=0)(id=9,age=0)(id=10,age=0)--------10

第十個月:(id=1,age=10)  (id=2,age=6) (id=3,age=5) (id=4,age=4) (id=5,age=3) (id=6,age=2) (id=7,age=2)(id=8,age=1)(id=9,age=1)(id=10,age=1)(id=11,age=0)(id=12,age=0)(id=13,age=0)(id=14,age=0)---14

 

1:以數學的思想解決此問題

  經過以上數列,能夠發現規律 a=an-1+an-4

  這時,能夠用遞歸的思想來解決

//使用遞歸實現
function get_rabbit_num($v)
{

if ($v==1){
return 1;
}
if ($v==2){
return 1;
}
if ($v==3){
return 1;
}
if ($v==4){
return 2;
}
else{
return get_rabbit_num($v-1)+get_rabbit_num($v-4);
}
}

echo get_rabbit_num(14);

二、以編程的思想來解決此問題
class rabbit{    public $id;    public $age;    public $parent_id;    public function __construct($id,$age,$parent_id)    {        $this->id=$id;        $this->age=$age;        $this->parent_id=$parent_id;    }}//月齡加1function addAge(&$v){    $v->age+=1;}//判斷是否能生孩子(第三個月的時候才懷上,第四個月才生出來)function isOk($v){   if ($v->age>3){       return true;   }else{       return false;   }}    $array_rabbit=[];//兔子的集合    $rabbit=new rabbit('1',0,0);//第一對兔子    array_push($array_rabbit,$rabbit);    for ( $i=0;$i<14;$i++){        array_filter($array_rabbit,"addAge");//每過一個月,先讓每對兔子的月齡+1        $array_tmp=array_filter($array_rabbit,"isOk");//找出能生兔子的兔子        $ok_num=count($array_tmp); //能生兔子的兔子數        if (!$ok_num){ //若是都不能生,直接開始下一輪循環            continue;         } else{        $id_max=max(array_column($array_rabbit,"id"));//最大的id值            foreach ($array_tmp as $item) {                $id_max+=1;//新生出來的兔子的id                $rabbit_new=new rabbit($id_max,0,$item->id);//新建一個兔子對象(新生出來的兔子月齡都爲0),並指向是哪對兔子生的                array_push($array_rabbit,$rabbit_new);//將新生出來的兔子加入集合            }     }    }echo count($array_rabbit);
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息
相關文章