递归思想和递推思想

有关函数的编程思想

递归思想一递归函数

例1   考察一个最简单的函数

function f1($n){

echo  $n;

$n++;

f1($n);

}

f1(1);

分析:此函数调用永无止境,内存消耗完毕,死机。

           实用的递归函数:能够控制这个调用的过程,会在某个时刻停下来。

例2    求5的阶乘

5!=1*2*3*4*5;

分析:数学上,阶乘的基本规则

        n!=n*n-1*.....*1;

         1!=1;

反推法:

假设有一个函数能够计算n的阶乘。

为了解决这个问题,引入适当的符号表示这个函数

function jiecheng($n){

$jieguo=$n*jiecheng($n-1);

return $jieguo;

}

$v1=jiecheng(8);//结果为8的阶乘

$v2=jiecheng(5);//结果为5的阶乘

如果你不能解决所提出的问题,可先解决一个与此有关的问题.你能不能想出一个更容易着手的有关问题?一个更特殊的问题?

当 n=5时

$jieguo=5*jiecheng(4);==》

n=4==>

$jieguo=5*(4*jiecheng(3));==>

n=3;

$jieguo=5*(4*3*(jiecheng(2)));==>

n=2

$jieguo=5*(4*3*(2*jiecheng(1))));

n=1时

function jiecheng($n){

if($n==1){

return 1;

}

$jieguo=$n*jiecheng($n-1);

return $jieguo;

}


$v2=jiecheng(5);//结果为5的阶乘


练习:求8的阶乘

答案:

function jiecheng($n){

echo "<br/>开始:有人求的{$n}的阶乘:1";

if($n==1){

echo "<br/> 结束:终于求的{$n}的阶乘:1";

return 1;

}

$jieguo=$n*jiecheng($n-1);

echo "<br/> 结束:终于求的{$n}的阶乘:$jieguo";

return $jieguo;

}

$v2=jiecheng(8);//结果为8的阶乘


递归思想:

面对一个大问题,该大问题可以经由该问题的同类“小一级”问题而经过简单计算获得。

而且可以获知这类问题的最小一级问题的答案。此时就可以使用递归思想来解决问题。

递归函数的基本模式

function digui($n){

if(是最小一级){

return  已知答案;

}

$jieguo=对digui($n-1)进行简单运算;

return  $jieguo

}

练习: 1,1,2,3,5,8,13,

说明:

  第一项 1

第二项   1

其他项    其前两项的和

求n项

[分析】

反推法

假定一个函数求出结果

function shulie($n){

if($n==1||$n==2){

return 1;


}

$result=shulie($n-2)+shulie($n-1);

return $result;

}

$v1=shulie(20);

结论

反推模式:最终目标:要求最大级问题-----》小一级问题-----》更小级问题------》最小级问题:答案已知

话术递归法     未来猜想--》现在---》过去--》大学--》高中---》初中---》小学---》幼儿园--》出生

递推(迭代)思想

例1  求5的阶乘

[]

代码演示:  

<?php


//1的阶乘

$jiecheng1=1;

$jiecheng2=$jiecheng1*2;

$jiecheng3=$jiecheng2*3;

$jiecheng4=$jiecheng3*4;

$jiecheng5=$jiecheng4*5;

?>

将上述代码优化


<?php

//1的阶乘

$qian=1;//表示前一个已知答案

for($i=2;$i<=5;++$i){

$jieguo=$qian*$i;//要求的结果是前一个结果经过简单乘法运算得到。

echo "<br/>{$i}的阶乘为:$jieguo";

$qian=$jieguo;//将当前求得结果,当成前一个,以供下一次使用

}

echo  "<br/>结果为:".$jieguo;


?>

结论:

如果要求一个大问题,且该问题有如下2个特点:

已知该问题的同类问题的最小问题的答案

如果知道这种问题的小一级问题的答案,就可以轻松求得大一级问题的答案,并且此问题级次有一定规律。

$qian=已知问题最小一级问题的答案

for($i=最小一级的下一级;$i<=最大一级的级次;++$i){

$jieguo=对$qian进行一定的计算,需要使用$i;

$qian=$jieguo;

}

echo "结果:" .$jieguo

推广:上面的例子

<?php

$qian1=1;

$qian2=1;

for($i=3;$i<=20;$I++){

$jieguo=$qian1+$qian2;

$qian1=$qian2;

$qian2=$jieguo;


}

echo "<br/>数列的20项:$jieguo";



?>



递推思想:

最小问题:已知---》大一级  可求----》更大一级---》最大问题。

选择:

即可选择递归又可选择递推,推荐递推。


项目实战的应用

PHP无限分类技术

参阅php中文网《PHP无限级分类之实现原理》

地址:

http://www.php.cn/code/3966.html

什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容