C语言 汉诺塔问题

汉诺塔问题对栈和递归的运用有更好的理解,属于递归初级比较经典的案例

解决递归问题最好的办法就是放弃深入思考,找到它的交接点和递归结束的判定点是最重要的

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;
}

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/kawayi90hou/article/details/79899646
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞