灰色小妖 发表于 2014-11-7 15:27:08

关于汉诺塔

本帖最后由 灰色小妖 于 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
不理解为什么
谢谢讲解!

灰色小妖 发表于 2014-11-7 15:30:52

图上不去代码如下
#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 上
        }
}





灰色小妖 发表于 2014-11-7 15:32:26

http://bbs.fishc.com/home.php?mod=space&uid=209403&do=album&picid=5965&goto=down#pic_block

青玄 发表于 2014-11-7 21:45:26

#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 ;
}



恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实现的也是不是很理解!
然后我就单步调试,调试上几遍,也就明白了!实在不明白的话!反汇编一下,原理也就清楚了!

(_依然饭特稀 发表于 2014-11-8 15:48:20

{:9_227:}

我是桃川人 发表于 2014-11-10 22:42:38

青玄 发表于 2014-11-7 21:45
恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实 ...

多谢!“press anykey continue”

dsa159245 发表于 2014-11-11 00:05:47

过两天我也来试试

wangqh1983 发表于 2014-11-11 10:19:08

青玄 发表于 2014-11-7 21:45
恩~~建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实 ...

谢谢!, 指导学习!

honey_boy 发表于 2014-11-16 22:13:58

一步步写出来看看也

lyjztz 发表于 2014-11-21 19:56:51

最后一步

灰色小妖 发表于 2014-12-19 22:58:08

其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

xueying 发表于 2014-12-29 19:28:49

学习中

微逻辑 发表于 2014-12-31 14:17:00

{:7_112:}

ZM_Lxwz 发表于 2015-1-4 16:42:20

灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

参数是传递的变不变得看穿进去的是多少

lixiaoshuai 发表于 2015-1-11 21:46:31

灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

如果穿进去得是指针或引用,会变。其他一般不变。

buxiaode 发表于 2015-5-28 21:54:43

本帖最后由 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:09:21

本帖最后由 Prolearning 于 2015-6-5 23:10 编辑

灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

不会,形参名是固定的.因为这里传递只是值不是传递指针,变的只是每次递归传过去的值

溯月0503 发表于 2015-6-8 11:14:14

学习中

溯月0503 发表于 2015-6-24 12:27:21

move(1,x,y,z)是借助y把x移动到z上去!!!这一点在小甲鱼的视频中讲的很清楚呀

阔怀 发表于 2015-8-16 16:04:21

受教了
页: [1] 2
查看完整版本: 关于汉诺塔