有关函数的编程思想
递归思想一递归函数
例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无限分类的功能了。
无限级分类原理简介