网上关于这个问题有很多人说这个符合斐波那契数列,但是我个人在推算的时候发现并不是这样的,所以想自己解决这个问题
建立一个兔子类
属性有ID,age
public class rabbit{
public $id;
public age;
}
第1个月:(id=1,age=1)------------------------------------------------------------------------------------------------------------------------------------------------------------------1
第2个月:(id=1,age=2)------------------------------------------------------------------------------------------------------------------------------------------------------------------1
第3个月:(id=1,age=3)------------------------------------------------------------------------------------------------------------------------------------------------------------------1
第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:以数学的思想解决此问题
通过以上数列,可以发现规律 an =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); 2、以编程的思想来解决此问题
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);
原文地址:https://www.cnblogs.com/aibaofeng/p/9815502.html