学到了汉诺塔问题,别人给的代码我看不懂,实在是不知道为什么要这么写,麻烦各位帮我解释一下吧。
位选,选位置。我要选择哪一位数码管亮。
段选,选一段。我要选择哪一段LED亮.
我可以为您解释汉诺塔问题的背景和意义以及给出一些具体的例子。
汉诺塔问题是一个经典的算法问题,源自印度传说。内容是这样的:在一个铜柱上,有n个盘子,这些盘子大小不一,它们可以装到任何一个比它们大的盘子上,但不能放到比它们小的盘子上。现在要把这些盘子移到另一个铜柱上,且做到最少的移动次数,如下图所示:
汉诺塔问题的意义在于,它可以帮助我们理解递归算法的思想。递归算法是一个函数自己调用自己的算法,它的核心思想是解决一个大问题,可以通过不断缩小这个问题的规模,把大问题分解成很多小问题,最后把小问题的结果合并起来得到大问题的结果。在汉诺塔问题中,我们可以把把大的盘子移到另一个柱子看成一个大问题,而把把小的盘子移到另一个柱子看成一个小问题,通过递归算法,我们可以很容易地解决这个问题,从而理解递归的思想。
下面是汉诺塔问题的代码实现,假设有三个柱子,分别为A、B、C,n个盘子从A柱子移动到C柱子,使用递归算法实现:
#include <iostream>
using namespace std;
void move(int n, char from, char to, char temp) {
if (n == 1) {
cout << "Move disk 1 from rod " << from << " to rod " << to << endl;
return;
}
move(n - 1, from, temp , to);
cout << "Move disk " << n << " from rod " << from << " to rod " << to << endl;
move(n - 1, temp, to, from);
}
int main() {
int n = 3; // n为盘子数量
move(n, 'A', 'C', 'B'); // 把n个盘子从A柱子移动到C柱子
return 0;
}
通过以上代码,我们可以很好地理解递归算法的思想,把大问题分解成小问题来解决,从而得到最终的答案。
唉。。。某些人的回答真的是不堪入目。。。。
汉罗塔解法的核心思想是把上面n-1个盘和最下面一盘盘子分开看。如果只剩下一个盘子,我们可以直接把它从起始柱移到终点柱,否则我们都假设有一个函数(hanoi函数),它完成前n-1个盘子从起始柱移到了辅助柱,再将剩下的那一个从起始柱移到终点柱(move函数)。此时每个柱子状态是:有n-1个在辅助柱,1个在终点柱,0个在起点柱。所以现在问题变为将n-1个盘子从辅助柱移向终点柱,这个问题与原始问题相比,规模小了一个,其余的都是一样,所以可以再次递归调用hanoi函数
这么写叫做递归,这么写比较简单直观。
这种思想就好比数学上的数学归纳法。