C++递归问题--罗汉塔

来源:百度知道 编辑:UC知道 时间:2024/05/15 08:26:01
#include<iostream>
using namespace std;
void move(int n,char s,char d)
{cout<<n<<","<<s<<"->"<<d<<endl;
}
void hanoi(int n,char A='A' ,charB='B',char C='C')
{if(1==n) move(n,A,C);
else
{hanoi(n-1,A,C,B);move(nA,C);hanoi(n-1,B,A,C);}
}
int main()
{hanoi(3);
return 0;}
谁帮忙解释下void hanoi(int n,char A='A' ,charB='B',char C='C') 为什么写成A='A' B='B' C='C' ? 有什么目的?
还有就是 这句hanoi(n-1,A,C,B);move(nA,C);hanoi(n-1,B,A,C);}
}
为什么写成ACB BAC?看了好几遍书也看不懂 会的帮忙解释下吧 谢谢了 越详细越好 +分

我觉得这样可能比较好理解一点
有三根柱子,标记为A, B, C
先要理解函数hanoi(n,A,B,C) 的意思是借助于B柱子将A上面的n个盘子移到C上面,必须充分对应到各个参数。
如果想将n个盘子从A柱子移动到C柱子
可以分为这样几个步骤

(1)必须将A最下面也就是最大的那个盘子移动到C最下面
首先需要借助C柱子将A上面的n-1个盘子移动到B上面
就是hanoi(n-1,A,C,B) 。
此时A上面只有一个最大的盘子,B上面按序放着n-1个盘子,C上面有0个盘子。
(2)将A上面的盘子移动到C上面,只需要1步。
此时A上面有0个盘子,B上面按序放着n-1个盘子,C上面只有一个最大的盘子。
(3)最后借助于A柱子将B上面n-1个盘子移到C上面即可
就是hanoi(n-1,B,A,C) 。
所以实际上数学推导公式为f(n)=2f(n-1)+1,其中f(1)=1,f(n)表示将n个盘子从A柱子移到C柱子的步数

如果还不明白的欢迎hi我 啊

void hanoi(int n,char A='A' ,charB='B',char C='C') 为什么写成A='A' B='B' C='C' ? 有什么目的?
给形参设初始值,当有参数传过来就用传过来的,n表示从盘子的大小,即第几号盘子,ABC分别表是3跟柱子。
hanoi(n-1,A,C,B);表示将n-1个盘子都移到B号柱子,
move(nA,C);将第n个盘子移到C号柱子
hanoi(n-1,B,A,C);} n-1个盘子移到C号柱子上,
三个参数传递的顺序是表示将哪个柱子上的盘子借助哪根柱子移到哪根柱子。
如:hanoi(n-1,A,C,B);表示将剩下的n-1个盘子从A借助C移到B上去。

希望这样你能理解。。。其实递归函数只要把握住他的公式就简单了,像我就不会管它太多,只要写出递归公式和结束条件(保证正确),计算机爱怎么跑就怎么跑,呵呵

这个问题我理解