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

形参和实参的问题

move(n-1,a,c,b)  #这里c是‘B’,b是“C”吗?
move(n-1,b,a,c) #这里b是“A”,a是“B” 吗?


正在回答

6 回答

这个有点难理解。它只是针对递归参数的位置变换,说参数为4ABC不好理解,假设参数4123。这个move(n-1,a,c,b)中c与b的位置进行了换位变成move(n,a,b,c),原本是(4,1,2,3)变成了(4-1,1,3,2),由于3大于1,继续递归,变成(4-1-1,1,2,3),一直到(4-1-1-1,1,3,2)才符合条件进行if语句,输出1-->2,跳出if判断,回上一层(4-1-1,1,2,3)再继续输出1-->3,(4-1-1,2,1,3),进行递归(4-1-1-1,2,3,1)符合if判断输入2-->1...就这样算的,建议用去IDE去用断点调试一下看看规律。回头我把这个递归层次全部列出来。

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

Evan233

谢谢大佬的讲解,不过还是很想看下递归的层次图,感觉自己的逻辑还不是很清晰,谢谢啦
2018-11-09 回复 有任何疑惑可以回复我~
#2

倚剑生死幻梦情 回复 Evan233

这里面有字数限制,我放下面了,写的是伪代码,你将就着看吧,如果还是看不懂,建议跳过来往下学,等其他学好了,再来看这个,其实你要学过遍历的话,这就是一个深度优先的遍历。
2018-12-02 回复 有任何疑惑可以回复我~
#3

Evan233 回复 倚剑生死幻梦情

谢谢大佬!了解了!
2018-12-18 回复 有任何疑惑可以回复我~

#if条件不成立的省略

# { 看做递归开始

# } 看做递归结束

move(4, a, b, c):{  #实际数值(4, A, B, C)

    move(3, a, c, b):{            #c,b调换,实际数值(3, A, C, B), 将这四个值带入move(3, a, b, c)递归1

        move(2, a, c, b):{        #c,b调换,实际数值(2, A, B, C), 将这四个值带入move(2, a, b, c)递归2

            move(1, a, c, b):{    #c,b调换,实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归3

                if n == 1:        #此时n==1,if条件成立

                print(a, '-->',c) #这是第一次打印A-->B

            }                     #最近的一次递归3完成,回到递归2,实际数值(2, A, B, C)

            print(a, '-->', c)    #这是第二次打印A-->C

            move(1, b, a, c):{    #a,b调换,实际数值(1, B, A, C), 将这四个值带入move(1, a, b, c)递归4

                if n == 1:

                print(a, '-->', c)#这是第三次打印B-->C        

            }                     #最近的一次递归4完成,回到递归2,实际数值(2, A, B, C)

        }                         #最近的一次递归2完成,回到递归1,实际数值(3, A, C, B)            

        print(a, '-->', c)        #这是第四次打印A-->B

        move(2, b, a, c):{        #a,b调换, 实际数值(2, C, A, B), 将这四个值带入move(2, a, b, c)递归5

            move(1, a, c, b):{    #c,b调换, 实际数值(1, C, B, A), 将这四个值带入move(1, a, b, c)递归6

                if n == 1:

                print(a, '-->', c)#这是第五次打印C-->A

            }                     #最近的一次递归6完成,回到递归5,实际数值(2, C, A, B)

            print(a, '-->', c)    #这是第六次打印C-->B

            move(1, b, a, c):{    #a,b调换, 实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归7

                if n == 1:

                print(a, '-->', c)#这是第七次打印A-->B

            }                     #最近的一次递归7完成,回到递归5,实际数值(2, C, A, B)

        }                         #最近的一次递归5完成,回到递归1,实际数值(3, A, C, B)

    }                             #最近的一次递归1完成,原参数中的move(n - 1, a, c, b)递归全部完成,实际数值(4, A, B, C)

    print(a, '-->', c)  #这是第八次打印A-->C,下面跟上面同样的方式去理解,就不写了,太累了。

    move(3, b, a, c):{

        move(2, a, c, b):{

            move(1, a, c, b):{

                if n == 1:

                print(a, '-->', c)   #这是第九次打印

            }

            print(a, '-->', c)#这是第10次打印

            move(1, b, a, c):{

                if n == 1:

                print(a, '-->', c)#这是第11次打印

            }

        }

        print(a, '-->', c)   #这是第12次打印

        move(2, b, a, c):{

            move(1, a, c, b):{

                if n == 1:

                print(a, '-->', c)   #这是第13次打印

            }

            print(a, '-->', c)#这是第14次打印

            move(1, b, a, c):{

                if n == 1:

                print(a, '-->', c)#这是第15次打印

            }

        }    

    }

}


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

把递归放这不是玩火呢

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

还是没懂啊

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

这只是表现形式问题。这个问题难点一是递归本身,第二是表现形式。

第一,把解决问题的思路写出来(递归)

第二,把思路里的每一步转换成代码(就是你说的难理解的点,在纸上标示出来或者断点调试都可以)

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

def move(n-1 , a,b,c),括号中为形参,子程序中不需要明确给定四个变量,

main中使用move()函数时括号中给出实参,四个及以内,main中引用时给出move(3,1,2,3),传递到函数中

n=3,a=1,b=2,c=3

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

举报

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

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

进入课程

形参和实参的问题

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号