汉诺塔问题对栈和递归的运用有更好的理解,属于递归初级比较经典的案例
解决递归问题最好的办法就是放弃深入思考,找到它的交接点和递归结束的判定点是最重要的
A B C 想把环从A移到C上,且只能把小环放在大环上面来移动
环数为1时:
A->C
———————————-
环数为2时:需要有B当个暂放点
A->B
A->C //递归的交接点
B->C
交换2^2-1次
———————————-
环数为3时:
A->C
A->B
C->B
A->C //递归的交接点
B->A
B->C
A->C
交换2^3-1次
———————————–
以下代码:
#include<stdio.h>
#include<stdlib.h>
static int cnt = 0;
void printHNT(char A, char B,int n) {
printf("第%d次移动:移动'%d'从%c -> %c\n", ++cnt, n, A, B);
}
void HanNuoTa(char A, char B, char C, int n) {
if (n == 1) {
printHNT(A, C, 1);//设置递归打印的开始,和递归结束的条件
return;
}
HanNuoTa(A, C, B, n - 1);//大于1的话,让B作为缓冲点,并在此函数内递归2^(n-1)次
printHNT(A, C, n);//递归完后回到主线程递归的交接点上,让最后一个环移动到C上
HanNuoTa(B, A, C, n - 1);//交换A和B立场,让B里的n-1个环进行2^(n-1)次递归
}
int main() {
char A = 'A', B = 'B', C = 'C';
int n;
printf("输入环的数目:");
scanf("%d", &n);
HanNuoTa(A, B, C, n);
return 0;
}