递归简论
假设:
F(x) = 2F(x-1) + x2 ; f(x|x<0) = 0; 那么这就是个递归函数,当一个函数用它自己来定义时就是递归函数。
function test($x)
{
if(x < 0)
return 0;
else
return test($x-1) + $x*$x;
}
实际上递归处理的调用和其它调用没有区别,
test(4); 当调用 test(4)必须调用test(3),以此类推,当$x小于0的时候,符合函数不触发递归的条件(即是 return test($x-1) + $x*$x;)此时递归调用结束才回返回值,
因此 限制性的是test(0)一次返回到text(4);在函数未到达 符合结束递归的条件时其它的函数调用会被挂起,直到有结束递归的条件出现时,才回倒序的解挂。
因此递归一定要有结束条件,一面造成死循环,导致内存不足程序崩溃。
递归函数编写的四条法则:
1:基准法则,必须有某些情形,不用递归就可以求解。
2:不断推进,对于某些求解时的递归情形,必须使得每次推进都是朝着接近,基准情形的方向推进
3:设计法则,假设所有的调用都能运行
4:合成效益法则:求解一个问题的同一实例时,切勿在不同的递归调用中做重复性工作。
如: function test($n)
{
if($n <= 0)
return 0;
else
return test($n-1) + test($n-2)
}
此时 时间T(n)=(5/3)n 呈几何倍的增长
不要把递归作为循环的简单替代