递归算法小结

递归算法的设计重在两点:

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. 快速排序(待补充)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值