为什么=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')
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')
2018-10-18
举个实际的例子你就明白了。
假设现在有三层楼,每层一个人。
一楼的人甲知道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后面跟函数的时候会执行完那个函数再结束
学习计算机不容易,且学且坚持
举报