1. 定义
一个直接调用自己或者通过一系列的调用语句间接调用自己的函数,称作递归函数。
2. 经典的递归实现——n阶Hanoi塔问题
描述:假设有三个命名为A,B,C的塔座,在塔座X插有n个直径大小各不相同你、依小到大编号为1,2,,,n的圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循以下规则:
1)每次只能移动一个圆盘;
2)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
分析:
1)当n=1时,只需要把编号为1的圆盘从X移到Z;
2)当n>1, 应将压在编号为n上面的n-1个圆盘从X移到Y,在将编号为n的圆盘从X移到Z,然后将塔座Y上的n-1个圆盘移至Z。
递归函数 hanoi()
//汉诺塔递归函数
void hanoi(int n,char x,char y,char z){
if(n == 1){
move(x,1,z); //将编号为1的圆盘从x移到z
}
else{
hanoi(n-1,x,z,y); //将x上编号为1至n-1的圆盘移到y,z作为辅助塔
move(x,n,z); //将编号为n的圆盘从x移到z
hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘移到z,x为辅助塔
}
}
这是一个递归函数,在函数执行过程中,需要多次进行自我调用。在高级语言编制的程序中,调用函数和被调用函数之间的链接及信息交换需通过栈来进行。
测试函数
#include <iostream>
using namespace std;
void move(char x,int n,char z){
static int count = 0;
printf("Step %2d: move disk%d from %c to %c",++count,n,x,z);
cout<<endl;
}
void hanoi(int n,char x,char y,char z){
if(n == 1){
move(x,1,z); //将编号为1的圆盘从x移到z
}
else{
hanoi(n-1,x,z,y); //将x上编号为1至n-1的圆盘移到y,z作为辅助塔
move(x,n,z); //将编号为n的圆盘从x移到z
hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘移到z,x为辅助塔
}
}
int main(){
hanoi(4,'A','B','C');
return 0;
}