如何理解php中的递归函数 (详细讲解)
functiondemo($n){if($n>1){$n=$n*demo($n-1);}else{return1;}return$n;}echodemo(10);...
function demo($n){
if($n>1){
$n=$n*demo($n-1);
}else{
return 1;
}
return $n;
}
echo demo(10); 展开
if($n>1){
$n=$n*demo($n-1);
}else{
return 1;
}
return $n;
}
echo demo(10); 展开
2个回答
展开全部
递归其实就是“一个函数的自调用”
在这个“自调用”的过程中,必须要有一个变化的“参数”,当这个“参数”达到你的期望值的时候,终止该“自调用”过程
拿楼主的程序来说
demo($n)内部又有调用demo($n-1),构成了“自调用”
且,$n又有一个“期望值”,即是$n>1,不满足此条件时,该自调用终止
即是说,最后一个执行的demo是demo($n9-1),其中$n9=2,然后返回为1(因为执行了return 1)
则$n9*demo($n9-1)即等于 2*demo(2-1),又等于2*1=2;
则$n8*demo($n8-1)即等于 3*demo(3-1),又等于3*2=6;
则$n7*demo($n7-1)即等于 4*demo(4-1),又等于4*6=24;
……
依次类推
这样想:
demo(1)是等于1,这个没有疑问吧?
然后demo(2)等于2*demo(1)=2*1=2
然后demo(3)等于3*demo(2)=3*2=6
……
一直到demo(10)
在这个“自调用”的过程中,必须要有一个变化的“参数”,当这个“参数”达到你的期望值的时候,终止该“自调用”过程
拿楼主的程序来说
demo($n)内部又有调用demo($n-1),构成了“自调用”
且,$n又有一个“期望值”,即是$n>1,不满足此条件时,该自调用终止
即是说,最后一个执行的demo是demo($n9-1),其中$n9=2,然后返回为1(因为执行了return 1)
则$n9*demo($n9-1)即等于 2*demo(2-1),又等于2*1=2;
则$n8*demo($n8-1)即等于 3*demo(3-1),又等于3*2=6;
则$n7*demo($n7-1)即等于 4*demo(4-1),又等于4*6=24;
……
依次类推
这样想:
demo(1)是等于1,这个没有疑问吧?
然后demo(2)等于2*demo(1)=2*1=2
然后demo(3)等于3*demo(2)=3*2=6
……
一直到demo(10)
更多追问追答
追问
这个程序是算的10 的阶乘
return $n 是啥意思? 是返回每一次乘的结果 然后最终都乘在一起? 谢谢
追答
return $n啊……
首先你要理解一点,一个函数比如
CODE:
demo($n){return $n+1;}
它的意义就是,demo($n)=$n+1,你获取demo(1)的值就等于获取2
你获取demo(2)的值就等于获取3
这个你应该理解的,然后我再变化一下:
CODE:
demo($n){return $n*demo($n+1);}
这个就构成递归了
但是这个递归没有出口,永远不会结束
首先,楼主,请用模拟下程序的思维,
你调用了demo(1),程序会怎么做?
第一步,程序会进入到函数体中第一步计算 1*demo(2) 对不对?
第二步,程序又遇到了第二个函数体,即是demo(2),于是进入到demo(2)中进行2*demo(3)
第三步,程序又遇到了第三个函数体,即是demo(3),于是进入到demo(2)中进行2*demo(4)
……
永无止境
除非 你加一个边界值:
CODE:
demo($n){
if($n>2)
return 1;
return $n*demo($n+1);}
其实这就是数学方程式:
n*f(n+1),n=3
这也就是为什么方程式和方法体都叫做函数(function)的原因
于是$n=3的时候,程序体终止,回到之前的第三步,得到了demo(3)=1
然后回到了之前的第二步,得到了demo(2)=2*demo(3)=2
然后回到之前的第一步,得到了demo(1)=1*demo(2)=2
说了这么多,return的意义就在于,让你的demo()函数体具有一个可以被计算的值
于是,你的式子也可以列出和上面那个一样的数学函数来了
n*f(n-1);n1
f替换成demo有什么区别么?
递归都可以用这种数学表达式列出来,是不是清晰很多?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
递归,就是自己调用自己,这个我想你已经能够了解,这里边最重要的是要有一条退出词句,这里的就是给出一个数字,让它一直调用到0,还拿你这个例子来说
//你的调用是demo(10),那这个值就是10,从10开始计数
function demo($n){
// 检查下你给的数字是几,如果>1,就递归,否则就返回1
if($n>1){
// 这里就是调用递归的地方,如果这里有个echo $n . '<br />'; 那你将会看到
// 10换行9换行8换行....直到1
// 还有一点要注意的是这里的函数使用方式,他把demo($n-1)做为一个数值来使用,
// 也不用感到不习惯,只需要把这个值代进去就行了
// 如果这时再把$n输出,将变成90,72,56
$n=$n*demo($n-1);
}else{
return 1;
}
// 这时返回值,如果不到最后关头,都是这里返回的,如果减到最后了(等于0了),最终结果将由上方的else返回
return $n;
}
//你的调用是demo(10),那这个值就是10,从10开始计数
function demo($n){
// 检查下你给的数字是几,如果>1,就递归,否则就返回1
if($n>1){
// 这里就是调用递归的地方,如果这里有个echo $n . '<br />'; 那你将会看到
// 10换行9换行8换行....直到1
// 还有一点要注意的是这里的函数使用方式,他把demo($n-1)做为一个数值来使用,
// 也不用感到不习惯,只需要把这个值代进去就行了
// 如果这时再把$n输出,将变成90,72,56
$n=$n*demo($n-1);
}else{
return 1;
}
// 这时返回值,如果不到最后关头,都是这里返回的,如果减到最后了(等于0了),最终结果将由上方的else返回
return $n;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询