关于汉诺塔
本帖最后由 灰色小妖 于 2014-11-7 15:29 编辑如图 三层的汉诺塔
首先调用 move(3,x,y,z)
然后 move(2,x,z,y)
然后
我认为应该是调用 move(1,x,z,y) 打印 x-->y
实际参数是 move(1,x,y,z) 打印 x-->z
不理解为什么
谢谢讲解!
图上不去代码如下
#include <stdio.h>
// 将 n 个盘子从 x 借助 y 移动到 z
void move(int n, char x, char y, char z)
{
if( 1 == n )
{
printf("%c-->%c\n", x, z);
}
else
{
move(n-1, x, z, y); // 将 n-1 个盘子从 x 借助 z 移到 y 上
printf("%c-->%c\n", x, z); // 将 第 n 个盘子从 x 移到 z 上
move(n-1, y, x, z); // 将 n-1 个盘子从 y 借助 x 移到 z 上
}
}
http://bbs.fishc.com/home.php?mod=space&uid=209403&do=album&picid=5965&goto=down#pic_block #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
//将 n 个盘子从 x 借助 y 移动到 z
void move(int n, char x, char y, char z)
{
if( 1 == n )
{
printf("%c-->%c\n", x, z);
}
else
{
move(n-1, x, z, y); //将 n-1 个盘子从 x 借助 z 移动到 y 上
printf("%c-->%c\n", x, z); //将 第n个盘子从x移动到z上
move (n-1, y, x, z); //将n-1个盘子从y借助x移动到z上
}
}
int main()
{
int n;
printf("\n\n******************汉诺塔问题*******************\n\n");
printf("请输入汉诺塔的层数输入0表示程序的结束: ");
scanf("%d", &n);
if(n == 0)
{
printf("\n");
printf("\t\t程序结束 !!\n\n");
exit(1);
}
printf("移动的步骤如下: \n");
while(n != 0 )
{
move(n, 'X', 'Y', 'Z');
printf("请输入汉诺塔的层数输入0表示程序的结束: ");
scanf("%d", &n);
if(n == 0)
{
printf("\n");
printf("\t\t程序结束 !!\n\n");
break;
}
printf("移动的步骤如下: \n");
}
system("pause");
return 0 ;
}
恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实现的也是不是很理解!
然后我就单步调试,调试上几遍,也就明白了!实在不明白的话!反汇编一下,原理也就清楚了!
{:9_227:} 青玄 发表于 2014-11-7 21:45
恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实 ...
多谢!“press anykey continue” 过两天我也来试试 青玄 发表于 2014-11-7 21:45
恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实 ...
谢谢!, 指导学习! 一步步写出来看看也 最后一步 其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。 学习中 {:7_112:} 灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。
参数是传递的变不变得看穿进去的是多少 灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。
如果穿进去得是指针或引用,会变。其他一般不变。 本帖最后由 buxiaode 于 2015-5-28 21:56 编辑
主要是 参数 传递 和 变量 混淆了 ,现 说明如下:
//将 n 个盘子从 x 借助 y 移动到 z
void move(int n, char xx, char yy, char zz)
{
if( 1 == n )
{
printf("%c-->%c\n", xx, zz);
}
else
{
move(n-1, xx, zz, yy); //将 n-1 个盘子从 xx 借助 zz 移动到 yy 上
printf("%c-->%c\n", xx, zz); //将 第n个盘子从xx移动到zz上
move (n-1, yy, xx, zz); //将n-1个盘子从yy借助xx移动到zz上
}
}
1: move(3,'X','Y','Z')// move( n, xx,yy,zz) // xx='X',yy='Y',ZZ='Z'
执行 move(2, 'X','Z','Y')//此处不展开
输出2,'X'-->'Z'
执行 move(2, 'Y','X','Z')
2: move(2, 'Y','X','Z')// move( n, xx,yy,zz) // xx='Y',yy='X',ZZ='z'
执行 move(1, 'Y','Z','X')//此处不展开
输出1,'Y'-->'Z'
执行 move(1, 'X','Y','Z')
3:move(1, 'X','Y','Z') //move( n, xx,yy,zz) // xx='X',yy='Y',ZZ='Z'
==1, 'X'-->'Z'
本帖最后由 Prolearning 于 2015-6-5 23:10 编辑
灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。
不会,形参名是固定的.因为这里传递只是值不是传递指针,变的只是每次递归传过去的值 学习中 move(1,x,y,z)是借助y把x移动到z上去!!!这一点在小甲鱼的视频中讲的很清楚呀 受教了
页:
[1]
2