鱼C论坛

 找回密码
 立即注册
查看: 1574|回复: 7

[已解决]救命!!

[复制链接]
发表于 2020-8-4 16:43:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
还是汉诺塔,那天我以为我懂了,结果昨天睡不着想了一下,发现自己还是不懂。思路我知道,就是代码里面的实参和形参给我整懵了,求大佬救命呀。

def hanota(n,x,y,z):
    if n == 1:
        print(x,'--->',z)
    else:
        hanota(n-1,x,z,y)#将前n-1个盘子从x移到y上
        print(x,'-->',z)#将底下的最后一个盘子从x移到z
        hanota(n-1,y,x,z)#将y的n-1个盘子移到z上
hanota(3,"x","y","z")

为什么传入的是"x","y","z"
打印却没带""

最佳答案
2020-8-4 17:41:22
def hanol(n,a,b,c): # 这里的 a b c 就是形参,需要人为赋值的参数,可以理解为一个变量
    if n == 1:
        print(a,'->',c)

    else:
        hanol(n-1,a,c,b)
        print(a,'-->',c)
        hanol(n-1,b,a,c)

n = int(input('请输入汉诺塔的层数:'))
def hanol(n,a,b,c):
    if n == 1:
        print(a,'->',c)

    else:
        hanol(n-1,a,c,b)
        print(a,'-->',c)
        hanol(n-1,b,a,c)

n = int(input('请输入汉诺塔的层数:'))
hanol(n,'x','y','z') # 这里的 x y z 就是实参,可以理解成有实际意义的数值 或者 字符串之类的

# 之所以传入的是 'x' 'y' 'z' 但是最终打印的时候没带 ' ' 引号,是因为打印出来的是一个数值,而不是字符串。
# 如果想要连引号也打印出来的话可以如下
hanol(n,'"x"','"y"','"z"')# 在单引号中在加个双引号,或者在双引号内再加个单引号都行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-4 16:44:46 | 显示全部楼层
本帖最后由 sunrise085 于 2020-8-4 16:47 编辑

你调用的时候不写xyz,改成abc可能更好理解
hanota(3,"a","b","c")
用print打印字符串的时候,打印出来的效果是不会带外面的引号的
def hanota(n,x,y,z):
    if n == 1:
        print(x,'--->',z)#这里的x和z是变量
    else:
        hanota(n-1,x,z,y)#将前n-1个盘子从x移到y上
        print(x,'-->',z)#将底下的最后一个盘子从x移到z
        hanota(n-1,y,x,z)#将y的n-1个盘子移到z上
hanota(3,"x","y","z")#这里的"x" "y" "z"是字符串内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 16:45:41 | 显示全部楼层
就是print字符串
一样的道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 16:59:04 | 显示全部楼层
20b1963f25068dc67337abcff08f457.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-4 17:41:22 | 显示全部楼层    本楼为最佳答案   
def hanol(n,a,b,c): # 这里的 a b c 就是形参,需要人为赋值的参数,可以理解为一个变量
    if n == 1:
        print(a,'->',c)

    else:
        hanol(n-1,a,c,b)
        print(a,'-->',c)
        hanol(n-1,b,a,c)

n = int(input('请输入汉诺塔的层数:'))
def hanol(n,a,b,c):
    if n == 1:
        print(a,'->',c)

    else:
        hanol(n-1,a,c,b)
        print(a,'-->',c)
        hanol(n-1,b,a,c)

n = int(input('请输入汉诺塔的层数:'))
hanol(n,'x','y','z') # 这里的 x y z 就是实参,可以理解成有实际意义的数值 或者 字符串之类的

# 之所以传入的是 'x' 'y' 'z' 但是最终打印的时候没带 ' ' 引号,是因为打印出来的是一个数值,而不是字符串。
# 如果想要连引号也打印出来的话可以如下
hanol(n,'"x"','"y"','"z"')# 在单引号中在加个双引号,或者在双引号内再加个单引号都行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 22:02:41 | 显示全部楼层
谢谢各位鱼友。知道自己的问题有多么蠢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 22:17:33 | 显示全部楼层
sunrise085 发表于 2020-8-4 16:44
你调用的时候不写xyz,改成abc可能更好理解

用print打印字符串的时候,打印出来的效果是不会带外面的引 ...

def hanota(n,x,y,z):
    if n == 1:
        print(x,'--->',z)
    else:
        hanota(n-1,x,z,y)#将前n-1个盘子从x移到y上
        print(x,'-->',z)#将底下的最后一个盘子从x移到z
        hanota(n-1,y,x,z)#将y的n-1个盘子移到z上

        
>>> hanota(3,"a","b","c")
a ---> c
a --> b
c ---> b
a --> c
b ---> a
b --> c
a ---> c
首先谢谢各位鱼友回答我的帖子,我带入了"a","b","c"还是不明白形参和实参以下就是我的疑惑
第一hanota(n,x,y,z),函数首先是形参,传入hanota(3,"a","b","c")==(3,x="a",y="b",z="c"),调用函数传入实参。当运行到递归hanota(2,x,z,y)---为什么x=x z=y y=z?????是赋值了么
第二,假设赋值x=x z=y y=z    为什么递归这个时候hanota(1,x,z,y)又翻过来等于hanota(1,x,y,z)。。。
第三:第一次打印的时候print(x,'--->',z)  这个z="c"呀
其实打了很多字,但是都删了。迷惑了----描述我都描述的不清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 22:25:32 | 显示全部楼层
你的空间想象力不够,你的逻辑思维有待加强。
第一hanota(n,x,y,z),函数首先是形参,传入hanota(3,"a","b","c")==(3,x="a",y="b",z="c"),调用函数传入实参。当运行到递归hanota(2,x,z,y)---为什么x=x z=y y=z?????是赋值了么

第一次调用hanota(n,x,y,z),函数首先是形参,传入hanota(3,"a","b","c")==(3,x="a",y="b",z="c"),
在执行hanota的时候,遇到 hanota(n-1,x,z,y),你知道把 n-1,换成2,为什么不知道把xyz换成abc呢?
当运行到递归hanota(2,x,z,y)---为什么x=x z=y y=z?????是赋值了么

难道不应该是hanota(2,'a','c','b')吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 08:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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