在编写计算机程序时,有时使用递归算法可以有效解决一些问题,递归算法往往使算法的描述简洁而且易于理解。
递归算法,就是一种直接或者间接地调用自身的算法:
递归算法的具体实现过程一般通过函数(或子过程)来完成,在函数(或子过程)的内部,编写代码直接或间接调用函数(或子过程)本身,即可完成递归操作。
从递归算法的实质可以看出,递归算法也是一种循环,只是这种循环不是使用程序设计语言的循环语句来实现,而是循环调用函数(或子过程)自身来实现的。要实现这种循环,一般有三个要求:
1、每循环调用一次,求解问题的规模都要有所缩小,即将求解的问题化为一个缩小了的子问题;
2、相邻的两次循环之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
3、当子问题的规模极小时,应该能直接给出解答而不再进行递归调用(即必须有一个结束递归的条件),因而每次递归都是有条件的,无条件递归调用将会使程序进入死循环而不能正常结束(最终导致堆栈溢出)。
由以上递归算法的要求可以看出,在使用递归算法解决问题时,需要注意以下几点:
1、在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口;
2、递归算法解题通常显得很简洁,但递归算法解题的运行效率低。所以一般不提倡用递归算法设计程序;
3、在递归调用的过程中,系统将每一次递归调用的返回点、局部变量等保存在系统的栈中,当递归调用次数太多时,就可能造成栈溢出错误。
实例:求阶乘
理解递归算法最简单的例子就是:编写程序求n的阶乘(n!):
function factorial(n){
if( n < 1 ){
return 1
}
return n*factorial( n - 1 )
}
网友评论