鱼C论坛

 找回密码
 立即注册
查看: 2316|回复: 12

递归调用问题困惑

[复制链接]
发表于 2016-2-5 10:37:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2016-2-5 17:24 编辑

在小甲鱼“零基础入门学习python”视频教程课后习题第24课递归:汉诺塔实现教学视频中:
def hanoi(n,x,y,z):
    if n ==1:
        print(x,'-->',z)
    else:
        hanoi(n-1,x,z,y)
        #将前n-1个盘子从x移动到y上
        print(x,'-->',z) #将最底下的最后一个盘子从x移动到z上
        #将y上的n-1个盘子移动到z上
        hanoi(n-1,y,x,z)

n = int(input('请输入汉诺塔的层数:'))
hanoi(n,'X','Y','Z')
运行能够正确输出结果
但是若将最后一行改写为:hanoi(n,x,y,z)
结果却报错,为:
Traceback (most recent call last):
  File "G:/Python/CodePractice/24.py", line 13, in <module>
    hanoi(n,x,y,z)
NameError: name 'x' is not defined
请问为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-5 11:04:09 | 显示全部楼层
你定义的函数名叫hanoi
你打的 是   hannoi
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-5 16:15:57 | 显示全部楼层
debi999 发表于 2016-2-5 11:04
你定义的函数名叫hanoi
你打的 是   hannoi

不好意思,打错了,我修改为hanoi后还是报错
Traceback (most recent call last):
  File "G:/Python/CodePractice/24.py", line 13, in <module>
    hanoi(n,x,y,z)
NameError: name 'x' is not defined
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 16:18:11 | 显示全部楼层
你调用的参数(n,x,y,z)
n定义了
xyz没有定义  所以报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-5 16:24:33 | 显示全部楼层
debi999 发表于 2016-2-5 16:18
你调用的参数(n,x,y,z)
n定义了
xyz没有定义  所以报错

python变量不是不需要定义吗?一开始程序也定义了hanoi(n,x,y,z)。
我想问的是为什么递归调用hanoi(n,'X','Y','Z')中的参数X,Y,Z是字符,需要用单引号,而为什么不是直接hanoi(n,x,y,z)呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 16:27:25 | 显示全部楼层
因为你X Y Z 没有赋值啊   
python 不知道他是什么类型啊
不知道类型的参数怎么调用啊。。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 16:31:49 | 显示全部楼层
而且你开头定义的xyz是在函数hanoi内的参数
和你最后调用hanoi函数时不能直接调用函数内参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-2-5 16:35:53 | 显示全部楼层
debi999 发表于 2016-2-5 16:27
因为你X Y Z 没有赋值啊   
python 不知道他是什么类型啊
不知道类型的参数怎么调用啊。。

这么说在不知道参数类型情况下,调用的函数参数可以使用‘X’来代替吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 16:38:12 | 显示全部楼层
f904399233 发表于 2016-2-5 16:35
这么说在不知道参数类型情况下,调用的函数参数可以使用‘X’来代替吗?

..........你还是回头再看一下关于函数的课吧
你没有理解函数内的参数是怎么调用的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-5 16:38:17 | 显示全部楼层
debi999 发表于 2016-2-5 16:31
而且你开头定义的xyz是在函数hanoi内的参数
和你最后调用hanoi函数时不能直接调用函数内参数

这点分析得很有道理,赞一个!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-5 16:39:44 | 显示全部楼层
debi999 发表于 2016-2-5 16:38
..........你还是回头再看一下关于函数的课吧
你没有理解函数内的参数是怎么调用的

好的,谢谢啦!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 17:05:36 | 显示全部楼层
  1. def hanoi(n,x,y,z):
复制代码

这个函数是要传入四个参数的,而这四个参数必须要是确定的值,这样在函数中才能调用呀
我估计你是把变量x 和 字符串'X'搞混了
没有用 单引号 引起来的叫做变量, 用单引号引起来的才是确定的值

再给你举个例子
搜狗截图16年02月05日1656_1.png
直接输入x就会报错,因为没有定义
然后定义了一个两个数相乘的函数,
当你没有给x,y赋值的时候,直接调用mul(x,y)就会报错,因为函数不知道x,y的值,自然就没法运算
但对x,y赋值以后,在调用这个函数就没有问题了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-5 17:39:41 | 显示全部楼层
shuofxz 发表于 2016-2-5 17:05
这个函数是要传入四个参数的,而这四个参数必须要是确定的值,这样在函数中才能调用呀
我估计你是把变量 ...

好的,谢谢你啦!解释的很详细nice!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-19 13:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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