【无标题】经典 递归 汉诺塔


汉诺塔经典比较基础,但对刚学习递归的人来说并不好理解。共有n层

下面是自己的思路想法

1.n=1,a->c 递归最基层

2.n=2,将第一个a->b  再将第二个从a->c 再将第一个从b->c

3.递归思想即为将n层的上边n-1层从a->b,最底层a->c,再将n-1个从b->c.

而要将n-1层借助a移动到c,等价于在n-1层问一下,借助b移动到c

 

#include 
int num = 0;//移动次数
void fun(int k, char a, char b, char c);
void move(char x, char y);
int main() {
	int n;
	scanf("%d", &n);
	fun(n, 'A', 'B', 'C');

	return 0;
}
void fun(int k,char a,char b,char c) {
	if (1 == k) move(a, c);
	else if (k > 1) {
		fun(k - 1, a,c,b);
			move( a, c);
			fun(k - 1, b, a, c);

	}

}
void move(char x,char y) {
	printf("%c->%c\n", x, y);
}

        延伸求移动次数,设n层是a(n),a(n)=a(n-1)*2+1;

理解:a(n-1)即n层的上边n-1层从a->b,,+1即为最底层a->c,再将n-1个从b->c(  还是a(n-1))

注释:再将n-1个从b->c(  还是a(n-1)),是 因为这次移动只是借助的柱子b变为了a,移动次数还是和在n-1层问题下的移动次数。

       这样移动次数递归,最基层a(1)=1,这样就解决了。

可是有个数值范围问题,层数太多,超过了long long 的最大数值 则需要用  (点击这里高精度讲解)!

你可能感兴趣的:(算法,c语言,c++,c#)