一个函数调用其自身就是递归。最经典的递归求阶乘如下:
int Factorial(int n){
if(n == 0)
return 1;
return n * Factorial(n-1);
}
递归和普通函数调用都是通过栈实现的。
汉诺塔问题
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。
汉诺塔问题手工模拟解法如下图所示:
递归解决:
#include<iostream>
using namespace std;
/*将src座上的n个盘子,以mid座为中转,移动到dest座*/
void Hanoi(int n, char src, char mid, char dest){
if(n == 1){ //只需移动一个盘子
cout<<src<<"->"<<dest<<endl;//直接将盘子从src移动到dest即可
return ; //递归终止
}
Hanoi(n-1,src,dest,mid); //先将n-1个盘子从src移动到mid
cout<<src<<"->"<<dest<<endl; //再将一个盘子从src移动到dest
Hanoi(n-1,mid,src,dest); //最后将n-1个盘子从mid移动到dest
return ;
}
int main(){
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}