汉诺塔问题如何反映递归的本质
汉诺塔问题我们从中学习的研讨的个人觉得并不是细节上的如何移动,而是从宏观上来理解盘子是如何从初始柱到终止柱的。
汉诺塔问题的本质个人认为是围绕:F(n)=n+F(n-1),这个公式来展开的,为何这么说呢?
我们首先抛开中间过程,直击该问题的目标,汉诺塔问题要实现的目标是将初始柱上的n个盘子移动到目标柱上。
我们不妨想一想我们要将n个盘子(最上方的盘子为n)移动到目标柱上,则需要先将前面的n-1个盘子都要移动到目标柱上去,而要完成这个条件,我们需要将前面n-2个盘子移动到目标柱上去,以此类推下去我们的最后事情的规模将变成F(2)=F(1)+2,而F(1)便是我们该次递归的出口,这便很好的展现了递归的本质(将一个大的事情的规模不断缩小)。
如何写出汉诺塔问题及其代码
#include <iostream>
using namespace std;
void move(char src, char dest) {
cout << src << "-->" << dest << endl;
}
void hannoi(int n, char src, char medium, char dest) {
if (n == 1) {
return move(src, dest);
}
else {
hannoi(n - 1, src, dest, medium);
move(src, dest);
hannoi(n - 1, medium, src, dest);
}
}
int main() {
int m;
cout << "Enter the number of disks:";
cin >> m;
cout << "the steps to move" << m << "disks:" << endl;
hannoi(m, 'A', 'B', 'C');
return 0;
def hannuoi(n,src,medium,dest):
if n==1:
print(src,'--->',dest)
return 0
else:
hannuoi(n-1,src,dest,medium)
print(src,'--->',dest)
hannuoi(n-1,medium,src,dest)
return 0
首先从(汉诺塔问题如何反映递归的本质)这一段我们知道了,汉诺塔问题是符合递归的。所以我们在想如何写出这个代码时需要想到递归问题的本质是将事情的规模无限的缩小成能缩小成的最小事情规模,也就是F(2)=F(1)+2。此时的事情规模已经完全变成了我们可以手动画出来的形态,我们可以将F(2)看作F(n),F(1)看作F(n-1),2看作n。
hannuoi函数里面的三个柱子分别认为是起始柱子,中间柱子,和每次需要移动到的目标柱子。
这时候我们通过看成两部分盘子就不难知道每次调用函数的移动是如何排的了。