8.1递归
递归:直接或间接调用自身
汉诺塔
#include<iostream>
#include<cstdio>
using namespace std;
long long Hanoi(int n){
if(n==1){
return 1;
}else{
return 2*Hanoi(n-1)+1;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
printf("%lld\n",Hanoi(n));
}
return 0;
}
对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:
1.将起始柱上的 n-1 个圆盘移动到辅助柱上;
2.将起始柱上遗留的 1 个圆盘移动到目标柱上;
3.将辅助柱上的所有圆盘移动到目标柱上。
由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。
汉诺塔III
#include<iostream>
#include<cstdio>
using namespace std;
long long Hanoi(int n){
if(n==1){
return 2;
}else{
return 3*Hanoi(n-1)+2;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
printf("%lld\n",Hanoi(n));
}
return 0;
}