递归实现累加与汉诺塔问题
1.在计算从1到n的累加时,可以使用for循环,也可以使用递归来实现,本篇内容将使用递归实现
核心内容就是递归的公式:
int addTo(int paraN) {
int tempSum;
printf("entering addTo(%d)\r\n",paraN);
if(paraN<=0){
printf("return 0\r\n");
return 0;
}
else {
tempSum=addTo(paraN-1)+paraN;
printf("return %d\r\n",tempSum);
return tempSum;
}
}
其实简化一下就是这个意思:
int clearAddTo(int paraN) {
if (paraN <= 0) {
return 0;
} else {
return clearAddTo(paraN - 1) + paraN;
}
}
其实使用递归来实现累加并不复杂,只要能够写出核心代码就可以,除此之外,递归还可以应用到更加复杂的问题上
2.汉诺塔问题是使用递归来实现的一个经典例子
汉诺塔上的盘子移动过程:
汉诺塔的核心代码:
void hanoi(int paraN,char paraSource,char paraTransit,char paraDestination){
if(paraN<=0){
return;
}else {
hanoi(paraN-1,paraSource,paraDestination,paraTransit);
printf("%c-->%c\r\n",paraSource,paraDestination);
hanoi(paraN-1,paraTransit,paraSource,paraDestination);
}
}
全部代码:
#include<stdio.h>
void hanoi(int paraN,char paraSource,char paraTransit,char paraDestination){
if(paraN<=0){
return;
}else {
hanoi(paraN-1,paraSource,paraDestination,paraTransit);
printf("%c-->%c\r\n",paraSource,paraDestination);
hanoi(paraN-1,paraTransit,paraSource,paraDestination);
}
}
void hanoiTest(){
printf("---hanoiTest begin---");
printf("2 plates\r\n");
hanoi(2,'A','B','C');
printf("3 plates\r\n");
hanoi(3,'A','B','C');
printf("---hanoiTest ends---\r\n");
}
void main(){
hanoiTest();
}
运行结果:
---hanoiTest begin---
2 plates
A-->B
A-->C
B-->C
3 plates
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
---hanoiTest ends---
**总结:**对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:
1.将起始柱上的 n-1 个圆盘移动到辅助柱上;
2.将起始柱上遗留的 1 个圆盘移动到目标柱上;
3.将辅助柱上的所有圆盘移动到目标柱上。
由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。