递归算法的设计重在两点:
1. 确定递归出口,即递归终止条件
2. 设计递归公式
典型的递归问题有:
1. 斐波那契数列
公 式:F(n) = F(n-1) + F(n-2) (n>=2)
递归出口:n=2时,F(1) =1, F(0) = 1
兔子产子问题,计算第n个月,出生的兔子对数,本质上就是一个斐波那契数列。
2. 求数的阶乘
公 式:F(n) = n*F(n-1) (n>=2)
递归出口:F(1) = 1
3. 求数列的最小公倍数和最大公约数
比如:a[4] = {2, 6, 8, 10}。
求解思路是:{2}与{6,8,10}之间的最小公倍数是a[4]数列的最小公倍数;进而求{6, 8, 10}的最小公倍数,可分解为求{6}与{8,10}间的最小公倍数。
直至分解到求2个数的最小公倍数。当两个数进行比较的时候,就是递归的出口。
4. 汉诺塔问题
汉诺塔的解题思路是当只有最底下一个盘子时,直接从A移动到C。否则,借用B将其上(n-1)的盘子先移动到B上,然后将最后一个盘子移动C上,再把(n-1)个盘子借由A移动到C上。
因此,很容易写出递归函数是:
void hanoi(int n,int a,int b,int c)
{
if(1==n)
cout<<"盘子从"<<a<<"移到"<<c<<endl;
else
{
hanoi(n-1,a,c,b);
cout<<"盘子从"<<a<<"移到"<<c<<endl;
hanoi(n-1,b,a,c);
}
}
5. 快速排序(待补充)