为了账号安全,请及时绑定邮箱和手机立即绑定

关于参数位置的问题

代码小白,也许是白痴问题,请勿笑

假设n初始值为2,结果为A-->B,A-->C,B-->C

第一次循环,到内层第一个move处,n变为n-1即1,所以在此处应输出if中的print,但因为move中b、c交换了位置,使得本应输出的A-->C变成了A-->B,是不是意味着if中的参数a、b只代表最外层move中形参的位置,而不是具体的某个参数?

内层move中参数交换到底是一个什么意义的操作?

正在回答

4 回答

我来把整段代码解释一下吧!希望能解决你的问题。

def move(n, a, b, c):    #定义一个函数(由下面代码的“a, '-->', c”可以看出,该函数的最终目的是要将a柱中的n个盘子全部移动到c柱中)。

    if n==1:
        print a,'-->',c       #只有一个盘子时,只需将其从a柱移动到c柱,一步到位。
        return
    move(n-1,a,c,b)       #这一行代码可以理解成是在继续定义函数,可以看出,与原始函数相比较,b与c的位置互换了,表示将a柱中的n-1个盘子移动到b柱中,b柱中就总共有n-1个盘子。那么,a柱中就只剩下最下面一个盘子了。
    print a,'-->',c           #然后一步是,将a柱中的盘子即剩下的最下面那个盘子移动到c柱中。
    move (n-1,b,a,c)      #接着定义函数,可以看出,与原始函数相比较,a与b的位置互换了,表示将b柱中的n-1个盘子(b柱中总共n-1个盘子)全部移动到c盘中。
move(4, 'A', 'B', 'C')     #输出利用‘B’这个中转站将‘A’中的4个元素按顺序替换到'C'中的结果。

再提个醒哦:move()代表的是一个函数,“因为move中b、c交换了位置,使得本应输出的A-->C变成了A-->B”这种理解欠妥哦, move(n, a, b, c)这行代码即表示将a柱中的n个盘子全部移动到c柱中(包含所要进行的所有步骤),而move(n-1,a,c,b)这行代码表示的是将a柱中的n-1个盘子移动到b柱中(包含所要进行的所有步骤),而move(n-1,a,c,b)与下面的那行代码 print a,'-->',c是分开的,print a, '-->', c 始终表示将a柱中的盘子移动到c盘中。  

1 回复 有任何疑惑可以回复我~
#1

優曇華 提问者

我能这么理解么,def的move中的abc是形参,函数中的move是在使用函数而非定义函数,所以其中的acb是传入实参,相当于将函数中move的acb赋予def的abc?
2017-07-23 回复 有任何疑惑可以回复我~
#2

郑安润

对的对的!真好,你没有被我一不小心的错误用词误导,冒号以下的move确实是在使用函数而非定义函数。 关于参数问题,我觉得可以这样理解,不管字母是哪个,只要记住字母的位置即可。以此问题为例,这个move()函数定义的就是将第一个位置的移动到第三个位置的,这点永远不变,不管字母如何变化。
2017-07-23 回复 有任何疑惑可以回复我~
#3

森满

您的意思是到return这里这个函数就定义完毕,接下来就是使用这个函数?那么为什么n=4,3,2时不是返回none而是a-->b?求解答
2017-08-08 回复 有任何疑惑可以回复我~

伤心伤心,写了那么长发现你已经采用了别的回答,但是我觉得他的回答跟搜到的答案一样,没有说到每一层它是怎样的而且他说的也不对,有两个print a-->c 语句,我暂且把在条件中的那个叫第一个,下面的叫第二个,第二个确实是始终是从A 移到C(不过它就只执行一次)然后第一个就要对应当前层的实参是什么,实际上第二个也是同理的,因为它对应的实参已经确定了啊,a就是A,c 就是C

1 回复 有任何疑惑可以回复我~
#1

郑安润

赞同你的说法!我虽然懂了,但表达得不够好,谢谢指教。
2017-07-23 回复 有任何疑惑可以回复我~
#2

優曇華 提问者

只能采用一个答案真是可惜,如果可能你们的答案我都想采纳,感谢大佬们的热心帮助!OTZ
2017-07-24 回复 有任何疑惑可以回复我~

对的,你的理解是正确的。我再帮你清晰一点,就先比如你说的n=2,在外层中,也就是move(2,A,B,C)中a=A,b=B,c=C,然后在这一层,先运行move(1,a,c,b),这里是进入到了第二层,它对应的a=A,b=C,c=B,因为n=1了,所以,它就执行a-->c,也就是A-->C,此时第二层执行完了,返回上一层,注意,每一层对应的是实参是什么,计算机会贮存起来,返回来就对应执行,所以返回到外层了,对应的abc就是a=A,b=B,c=C,所以执行下一步的print a-->c 就是A-->C 了。然后下面move(1,b,a,c)同理。

所以参数交换的意义就是在于对应print a-->c这个语句。

1 回复 有任何疑惑可以回复我~
#1

郑安润

哎呦,这样说得太容易让人搞晕。 关于参数问题,我觉得可以这样理解,不管字母是哪个,只要记住字母的位置即可。以此问题为例,这个move()函数定义的就是将第一个位置的移动到第三个位置的,这点永远不变,不管字母如何变化。
2017-07-23 回复 有任何疑惑可以回复我~

最简单的理解是,自左-->右,依次清空自己柱上的盘子,仅留一个。第一次,把a,移到b,然后再继续转移。只能理解,这个没法细说

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758623    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

关于参数位置的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信