当一个函数用它自己来定义时就称为递归。

递归不同于循环推理,递归虽然用方法本身定义方法但没有用方法本身定义方法的一个特定的实例,即由循环得到f(x)函数值,一般是以f(4)得到f(4)的函数值,但如果以递归求函数值f(4),则要先得到f(3)的函数值,即以f(3)得到f(4)的函数值,但如果求f(3)的值要用到f(4)的值就不是递归了。

一般情况下我们会说一个方法对特殊情况无效,而在其他情况下是正确的,但递归不同,对于递归程序来说,一个递归值无法计算,会导致依靠该递归值求值的其他值也无法计算,如:

public static int test( int n)

{

  if( n == 0)

    return 0;

  else

    return test( n / 3 + 1)  +  n - 1;

}

在该程序中由于test(1)无法计算,test(2)也无法计算,test(3)也无法计算,事实上所有非零正整数都无法计算。

递归有四个原则:

1,基准情形。在用递归求解时一定要有一个值不通过递归就能求解,否则递归会发生错误 。

2,不断推进。在递归调用中,每一次进行递归调用都要使状况向一种基准推进。

3,设计法则。假设所有的递归调用都能运行。递归调用的主要问题是隐含的簿记开销,对于递归程序没有必要追踪大量的递归调用,没有必要知道簿记管理的细节。

4,合成效益法则。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作,例如在计算诸如斐波那契数之类简单数学函数的值时使用递归一般不是好主意。

posted on 2018-02-05 20:06  AsiasticWormwood  阅读(149)  评论(0编辑  收藏  举报