栈的应用举例--递归

栈有一个重要应用就是在程序设计语言中实现递归

1.递归的定义:

递归(recursion)就是子程序或函数直接调用自己或者通过一系列语句间接调用自己,是一种描述问题和解决问题的基本方法.

递归通常用来解决结构自相似的问题.所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决.具体的,这个问题可以划分为两部分:第一部分是一些特殊的情况,有直接的解法;第二部分与原问题相似,但是比原问题的规模小.实际上, 递归时把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以解决。因为递归有两个要素:

1)递归边界条件:确定递归何时终止,也称为递归出口;

2)递归模式:大问题是如何分解为小问题的,也称为递归体.


2.递归的经典问题--汉诺塔问题

问题描述:有塔A,B,C;塔A上有64个碟子,按从大到小的顺序从塔底堆放至塔顶.有另外两个塔B,C.将A上碟子移动到塔C上去,期间借助塔B的帮助.每次只能移动一个碟子,任何时候不能把碟子放在比它小的碟子上面。

对于此问题,可以通过以下三个步骤完成:

1)将塔A上n-1个碟子,借助塔C先移动到塔B上;

2)将塔A上最后一个碟子移动到塔C上;

3)借助塔A将塔B上n-1个碟子移动到塔C上.

显然,这是一个递归求解的过程:

void Move(char A, char B)
{
	printf("%c -> %c\r\n", A, B);
}
void Hanoi(int n, char A, char B, char C)
{
	if (n == 1)
	{
		Move(A, C);
	}else
	{
		Hanoi(n-1, A, C, B);
		Move(A,C);
		Hanoi(n-1, B, A, C);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值