用C语言编写汉诺塔的程序,谭浩强版C的第四版的这个程序中,参数传递不懂 我学习C语言,现在看的谭浩强的C语言程序设计第4版,我刚看到...

\u9012\u5f52 \u6c49\u8bfa\u5854\u7684\u7591\u60d1 \u8c2d\u6d69\u5f3a\u8001\u5e08\u7684\u300ac\u8bed\u8a00\u8bbe\u8ba1\u6559\u7a0b\u300b

\u6c49\u8bfa\u5854\u62bd\u8c61\u53bb\u7406\u89e3\u5c31\u597d\u7406\u89e3\u4e86\u3002hanoi(n,a,b,c)\u8868\u793a\u5c06n\u4e2a\u76d8\u5b50\u4ecea\u79fb\u5230c\u3002\u9996\u5148\u5c06a\u4e0a\u9762n-1\u4e2a\u76d8\u5b50\u7531a\u79fb\u5230b\uff0c\u4e8e\u662f\u6709hanoi(n-1,a,c,b)\u3002\u518d\u5c06a\u4e0a\u6700\u5e95\u4e0b\u4e00\u4e2a\u76d8\u5b50\u79fb\u5230c\u4e0a\uff0c\u4e8e\u662f\u6709move(a,c)\u3002\u5269\u4e0b\u7684\u4e8b\u60c5\u5c31\u662f\u5c06b\u7684n-1\u4e2a\u76d8\u5b50\u79fb\u5230c\u4e0a\u4e86\uff0c\u4e8e\u662f\u6709honoi(n-1,b,a,c)\u3002\u6574\u4e2a\u6c49\u8bfa\u5854\u7a0b\u5e8f\u5c31\u662f\u8fd9\u6837\uff0c\u603b\u7ed3\u5c31\u662f\u5148\u5c06a\u4e0a\u9762n-1\u4e2a\u79fb\u5230b\uff0c\u7136\u540e\u5c06a\u6700\u4e0b\u9762\u4e00\u4e2a\u79fb\u5230c\uff0c\u518d\u5c06b\u4e0a\u9762\u7684\u6240\u6709\u79fb\u5230c\u3002\u6211\u89c9\u5f97\u6c49\u8bfa\u5854\u662f\u6211\u89c1\u8fc7\u7684\u6700\u5178\u578b\u7684\u7528\u81ea\u7136\u8bed\u8a00\u7f16\u7a0b\u7684\u8303\u4f8b\u3002

\u80af\u5b9a\u80fd\uff0c\u5b66\u4e00\u70b9 \u662f\u4e00\u70b9\uff0c\u7b80\u5355\u7684\u5f00\u59cb\uff0c

汉诺塔是一个利用递归函数的经典例子,利用一个逆向的思维进行解体,通过最后一步向第一步推进

每层所求的数据范围少了1

你要明白汉诺塔就是一个递归过程, 当有1个盘子从A移到C时, 直接已过去A--C
当有n个时,要把n-1个移到B,这样就A剩下一个了, 直接移到C, 再把B中n-1个移到C。
如题:
函数定义
move(a, c); 从a处移到c处。
hanoi(n, A, B, C)//把n个从A经过B移到C处。

if (n == 1)
直接从A移到C
move(A, C);
else
{
先把n-1个从A经过C移到B
hanoi(n-1, A, C,B);

剩下一个了,直接A移到C
move(A, C);

把B中的n-1个,从B,经过A, 移到C
hanoi(n-1, B, A, C);
}
初始:
1
2
3
A B C
第一次: 第二次 第三次 第四次 五 六 七
1
2 1 1 2 2
3 1 3 2 1 3 2 2 3 1 2 3 1 3 3
A B C A B C A B C A B C A B C A B C A B C

推算:
if 当n==1, 直接
else 当 n 个盘子时。

1
2
3
.
.
n-1
n
__ __ __
A B C

第一步:

1
2
3
.
.
n n-1
___ ___ ___
A B C
第二步:

1
2
3
.
.
n-1 n
___ ___ ___
A B C
第三步:
1
2
3
.
.
n-1
n
___ ___ ___
A B C

你的三个盘子的传递上不是应该用递归吗?为什么要用这种方式……
首先,按照你的程序来看,问题目的是将A上的盘经B移到C上(move函数的才是目的步骤)
hanoi(n-1,one ,three,two)是将n-1个经过three移到two处,此时剩下的在A上的那个大盘是从A到C,完成目的。
然后hanoi(n=1,two,one,three)是将two上的n-1个经过one移到three上。
程序没问题,你的理解稍微有些问题

扩展阅读:汉诺塔教学视频 ... 汉诺塔编程题 ... 汉诺塔图解一步一图 ... 汉诺塔问题c语言5个盘子 ... 汉诺塔c语言程序代码 ... 汉诺塔流程图 ... 汉诺塔十句口诀 ... 汉诺塔5层31全图图解 ... 5个汉诺塔步骤 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网