栈有一个重要应用就是在程序设计语言中实现递归
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);
}
}