递归算法:
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。使用递归技术往往使函数的定义和算法的描述简捷且易于理解。
特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用
的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出
等。所以一般不提倡用递归算法设计程序。
递归算法所体现的“重复”一般有三个要求:
一、
是每次调用在规模上都有所缩小(通常是减半);
二、是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三、是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
如何设计递归算法
1.确定递归公式
2.确定边界(终了)条件
列子:
(1). 阶乘函数
阶乘函数可递归的定义为
n=0时, n! = 1
n>0时,n! = n(n-1)!
递归式的第一式给出了这个函数 的初始值,是非递归地定义的。每个递归函数都必须有非递归的初始值,否则,递归函数就无法计算。递归式的第二式用较小的函数值来表示较大自变量的函数值的方式来定义n 的阶乘。第一式的左右两边都引用了阶乘记号,是一个递归定义式,可递归的计算如下:
int factorial(int n)
{
if(n==1) return 1;
return n*factorial(n-1);
}
(2). Fibonacci 数列
无穷数列1,1,2,3,5,8,13,21,34,55.........,称为Fibonacci 数列。它可以递归的定义为
这是一个递归关系式,它说明当n>1 时,这个数列的第n项的值是它前面两项之和。它用两个较小的自变量的函数值来定义一个较大自变量的函数值,所以需要两个初始值F(0)和F(1)。
第n个Fibonacci 数可递归的计算如下:
int fibonacci(int n)
{
if(n<=1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}