热门搜索: js    css学习    javascript    jquery分享    mysql数据库    div css    

php基础算法小程序(二)

时间:2016-04-18 20:57 文章来源:未知 点击次数:

php基础算法小程序二,这一节里面也是有几个小算法,一起分享给大家。希望给到大家相应的帮助。

/*

*

*用PHP解数学题

*有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。

*

*/

 

function cattle($n)

{

        static $num = 1

        for($j=1; $j<=$n; $j++)

{

                if($j>=4 && $j<15)

{

$num++;cattle($n-$j);

}

                if($j==20){$num--;}

         }

          return $num;

}

 

/*

*

*php 之环形链表

*基本思想:a==>b==>c==>d==>a;

*约瑟夫问题:设编号为1.2,...,n的N个小朋友围作一个圈。约定编号为k(1<=k<=n)的人开始报数,数到m的那个人出列,它的

下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出队编号的系列,

并求出最后出列的那个人是哪个?

*

*/

 

class Child{

          public $no;

          public $next=null;

         public function __construct($no)

         {

                  $this->no=$no;

         }

}

 

//定义一个指向第一个小朋友的引用

$first=null;

$n=40;//$n表示有多少个小朋友

//写一个函数来创建一个四十个小朋友的环形链表

function addChild(&$first,$n)

{

//1.头结点不能动,即$first不能动

$cur=null;

for($i=0;$i<$n;$i++)

{

$child=new Child($i+1);

//怎么构成一个环形链表

if($i==0)

{

$first = $child; //让first指向child,但是还没有构建环形链表

$first->next=$chid; //自己指向自己  

$cur=$first;

}else

{

$cur->next=$child;

$child->next=$first;

$cur=$cur->next; //继续指向下一个

}

}

}

//遍历所有的小朋友,显示必须把头$first给函数。

function showChild($first)

{

//遍历$cur变量是帮助我们遍历环形链表,所以不能动

$cur=$first;

while($cur->next !=$first)

{

echo '<br/>小朋友的编号是'.$cur->no;

$cur=$cur->next;

}

//当退出while 循环时,已经到了环形链接的最后,所以还要处理一下最后那位小朋友。

echo '<br/>小朋友的编号是'.$cur->no;

}

$m=31;

$k=20;

//问题简化,从第一个小孩开始数,数2,看看出圈的顺序

function countChild($first,$m,$k)

{

//思路:因为我们找到一个小朋友,就要把他从环形链表中删除

//为了能删除某个小朋友,我们需要一个辅助变量,该变量指向的小孩

//在$first前面

$tail=$first;

while($tail->next !=$first)

{

$tail=$tail->next;

}

//考虑是从第几个人开始数数

for($1=0;$i<$k-1;$i++)

{

$tail=$tail->next;

$first=$first->next;

}

//当退出while,我们的$tail就指向了最后这个小孩

//让$first和$tail向后移动,移动一次,相当于数2下。

//移动2次,相当于数了3下,因为自己数的时候是不需要动的。

while($tail !=$first)//当$tail ==$first则说明只有最后一个人了

{

for($i=0;$i=$m-1;$i++)

{

$tail=$tail->next;

$first=$first->next;

}

echo '<br/>出圈的小朋友的编号是'.$first->no;

//把$first指向的节点小朋友删除环形链表

$first=$first->next;

$tail->next=$first;

}

echo '<br/>最后出圈的小朋友的编号是'.$tail->no;

}

addChild($first,$n);

showChid($first);

//go

//countChild($first,$m,$k);

 

    热门排行