递归简论

假设:

F(x) = 2F(x-1) + x ; 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 呈几何倍的增长

 

不要把递归作为循环的简单替代

posted on 2014-05-26 21:12  木子牛  阅读(152)  评论(0编辑  收藏  举报

导航