让你秒懂汉诺塔的递归问题

要想弄清楚汉诺塔的递归问题,我们就先得游戏的规则入手:有A,B,C三座,将塔A上N个从小到大叠放的盘子移动到塔C,一次只能移动一个,不重复移动,小盘子必须在大盘子上面。
当N=3时的汉诺塔

首先,我们不谈复杂的情况,我们先用最“笨”的方法来完成汉诺塔游戏。
当N=1时
很简单,当汉诺塔只有一层,我们毫不犹豫的将塔A上的移动到塔C,sum=1;
当N=2时
我们利用B作为中转站,把第一块移动到B,接下来把第二块移动到C,再把第一块从B移动到C,sum=3;
当N=3时
我们进行如下的操作:
第一块:A->C
第二块:A->B
第一块:C->B
第三块:A->C
第一块:B->A
第二块:B->C
第一块:A->C
可得sum=7;
当我们解决汉诺塔有三层的问题时,发现存在着一个中间过程,即第一块和第二块一起被放在了中转站B上,若把这个状态看作一个过程,那么三层汉诺塔不就可以被看作先移动二层汉诺塔,再移动第三层汉诺塔,再将中转站上的二层汉诺塔移动到C上了吗?而移动二层汉诺塔的次数是固定的,我们设移动三层汉诺塔的次数为 H3 ,移动二层汉诺塔的次数为 H2 ,于是我们有 H3 = 2 × H2 +1 . 中间状态
要解决三层汉诺塔问题,就先得解决二层汉诺塔问题要解决三层汉诺塔问题,我们就先得解决两个二层汉诺塔问题再加上1,要解决二层汉诺塔问题,我们就得解决两个一层汉诺塔问题再加上1,以此类推,若要解决三层以上的汉诺塔问题,归根结底都是要解决一层汉诺塔的简单问题。

当N=n时
要解决n层汉诺塔问题,就得解决 2个 n-1 层汉诺塔问题和移动1次第 n 个汉诺塔,而这时问题就被拆解为只需研究 n-1 层汉诺塔的问题了 ,而 n-1 层汉诺塔可以一直继续拆解,一直拆解到当 n=1 的时候。 递推公式由此而来,可得Hn = 2× Hn-1 +1, 利用数学方法,可求得通项公式 Hn = 2n -1.
下面是递归程序的具体实现:

#include<stdio.h>
int hanoi(char A, char B, char C, int n)
{
    
    
	if (n == 1)
	{
    
    
		return 1;
	}
	return hanoi(A, C, B, n - 1) + hanoi(B, A, C, n - 1) + 1;
	
}
int main()
{
    
    
	int n;
	scanf("%d", &n);
	int sum = hanoi('A', 'B', 'C', n);
	printf("%d\n",sum);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52606524/article/details/113004637