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

为什么=1,又要print,又要return,为什么后面不用return

def move(n, a, b, c):
    if n ==1:
         a, '-->', c
        
    move(n-1, a, c, b)
    print a, '-->', c
    move(n-1, b, a, c)
move(4, 'A', 'B', 'C')


正在回答

4 回答

举个实际的例子你就明白了。

假设现在有三层楼,每层一个人。

一楼的人甲知道fact(1) = 1;

二楼的人乙知道fact(2) = 2*fact(1)

三楼的人丙知道fact(3) = 3*fact(2)

而你什么也不知道,只想知道fact(3)等于多少

        三个人中只有丙知道fact(3)等于多少,因此你只能去三楼问他。他告诉你,我只知道fact(3) = 3*fact(2),你如果知道fact(2)就结束了,我就能告诉你答案了。可是你不知道fact(2)等于多少,你只能去二楼找乙问他fact(2)等于多少。乙告诉你,我只知道fact(2) = 2*fact(1),你如果知道fact(1)等于多少就结束了,我就能告诉你答案了。可是你不知道fact(1)等于多少,你只能去一楼找甲问他fact(1)等于多少。甲告诉你fact(1)等于1;此时你到二楼告诉乙fact(1) = 1,乙告诉你fact(2) = 2*fact(1) = 2*1 = 2;然后你到三楼告诉丙fact(2) = 2,丙告诉你fact(3) = 3*fact(2) = 3*2 = 6。现在你知道fact(3) = 6了。

        别问我为什么你不能从一楼开始,因为你给计算机fact(3)这个命令的时候它可不知道算fact(3)还得知道fact(2),只有等到它真正执行到return 3*fact(2)的时候它才会明白原来要先算出fact(2)

下面我们进入正题,将这个例子转换为程序。

假如我们计算fact(3),

        此时会执行到return 3*fact(2);现在程序收到return了,想要结束了,它看到了fact(2),它又不知道fact(2)等于多少,因此它只能到这个fact(2)里面去看看fact(2)到底等于几。官方一点就是计算机执行到fact(2)时,系统会保存现在的状态,并将现在所处的环境状态压入栈中,继而执行fact(2),当在fact(2)中遇到fact(1)的时候又会压一次栈,当计算机算出fact(2) = 2的时候,才会执行出栈操作,回到return 3*fact(2)这句话,才会真正走到最后,也就是真正结束。


最后

当return 后面跟常量(具体的数)时立刻就会结束,并返回该常量

当return后面跟函数的时候会执行完那个函数再结束

学习计算机不容易,且学且坚持

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

因为虽然后面的执行完了,但是问题还没解决,整个函数还要递归地执行下去。直到n=1的时候才结束。也就是直到n=1的时候才return。

下面多讲一些:

并不是每一个函数都要return,需要写return有两种情况:

一种是函数需要停止,此时只写return;另一种是函数有数据需要返回,此时写return+(要返回的数据)。这个问题中就是第一种情况。


再多说一点。递归函数的一般形式都是

if(某个条件)

{最后一步)

elif(某个条件)

{递归执行}


比如说这个题我也可以不用return 

写成下面这个样子

https://img1.sycdn.imooc.com//5bc9cc3700010bd103250344.jpg

如果你对递归函数足够了解就会发现n=2的情况是完全多余的。自己改改吧,当然不改也是对的。


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

慕工程5589255 提问者

很感谢你的回答,为什么ef fact(n): if n==1: return 1 return n * fact(n - 1) 最后要return?不是应该继续执行下去吗?
2018-10-24 回复 有任何疑惑可以回复我~
#2

qq_空心_8

就跟1楼说的一样,明白点九是 假设f(1)=1 你想求f(3) 但你只知道f(3)=3*f(2) 你是不是需要知道f(2)是多少 所以你要去求f(2) 但f(2)=2*f(1) 所以这时候你就需要到f(1)=多少了 所以你先得去调用f(1)然后返回f(1)给f(2),求出f(2),再返回f(2)求出f(3)最后才是返回f(3)给你定义的函数
2018-10-31 回复 有任何疑惑可以回复我~

在函数中不论哪里遇到return语句都意味着这个函数已经执行完了,即使这个函数内后边还有代码也不执行了,要退出这个函数。

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

慕工程5589255 提问者

那后面执行完了,为什么不return?
2018-10-19 回复 有任何疑惑可以回复我~

这个return的意思是当n=1的时候只打印下面这一句话a,'-->',c整个函数就结束了,退出了。下面的语句都不执行了,下面的move()函数也就调用不到了,递归也就结束了。

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

举报

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

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

进入课程

为什么=1,又要print,又要return,为什么后面不用return

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

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

帮助反馈 APP下载

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

公众号

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