码迷,mamicode.com
首页 > 其他好文 > 详细

(兔子繁殖问题)有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到三个月后每个月又生一对兔子,假如兔子都不死,问32个月过后的兔子总数为多少?

时间:2018-10-19 14:07:43      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:count   foreach   cti   思想   三个月   斐波那契数列   false   for   []   

网上关于这个问题有很多人说这个符合斐波那契数列,但是我个人在推算的时候发现并不是这样的,所以想自己解决这个问题

 

建立一个兔子类

属性有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:以数学的思想解决此问题

  通过以上数列,可以发现规律 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);

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;
}
}
//月龄加1
function 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);

 


 

(兔子繁殖问题)有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到三个月后每个月又生一对兔子,假如兔子都不死,问32个月过后的兔子总数为多少?

标签:count   foreach   cti   思想   三个月   斐波那契数列   false   for   []   

原文地址:https://www.cnblogs.com/aibaofeng/p/9815502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!