鱼C论坛

 找回密码
 立即注册
查看: 8438|回复: 26

关于汉诺塔

[复制链接]
发表于 2014-11-7 15:27:08 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 灰色小妖 于 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
不理解为什么
谢谢讲解!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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 上
        }
}





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-7 15:32:26 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 ;
}
QQ截图20141107214051.png

恩~~  建议还是单步调试一下!这样的话!会更清楚一些!呵呵!以前的时候!我也是有很多的程序怎么实现的也是不是很理解!
然后我就单步调试,调试上几遍,也就明白了!实在不明白的话!反汇编一下,原理也就清楚了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-8 15:48:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

多谢!“press anykey continue”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-11 00:05:47 From FishC Mobile | 显示全部楼层
过两天我也来试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢!, 指导学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 22:13:58 | 显示全部楼层
一步步写出来看看也
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-21 19:56:51 | 显示全部楼层
最后一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-12-19 22:58:08 | 显示全部楼层
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-29 19:28:49 | 显示全部楼层
学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-31 14:17:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-4 16:42:20 | 显示全部楼层
灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

参数是传递的  变不变得看穿进去的是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-11 21:46:31 | 显示全部楼层
灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。

如果穿进去得是指针或引用,会变。其他一般不变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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'
   

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-5 23:09:21 | 显示全部楼层
本帖最后由 Prolearning 于 2015-6-5 23:10 编辑
灰色小妖 发表于 2014-12-19 22:58
其实我想问的是。。主函数调用子函数时候 x y z的值改变了 子函数的形参也会变么。。。


不会,形参名是固定的.因为这里传递只是值不是传递指针,变的只是每次递归传过去的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-8 11:14:14 | 显示全部楼层
学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-24 12:27:21 | 显示全部楼层
move(1,x,y,z)是借助y把x移动到z上去!!!这一点在小甲鱼的视频中讲的很清楚呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-16 16:04:21 | 显示全部楼层
受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表