為什么=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
舉報
2018-10-25
舉個實際的例子你就明白了。
假設現在有三層樓,每層一個人。
一樓的人甲知道fact(1) = 1;
二樓的人乙知道fact(2) = 2*fact(1)
三樓的人丙知道fact(3) = 3*fact(2)
而你什么也不知道,只想知道fact(3)等于多少
? ? ? ? 三個人中只有丙知道fact(3)等于多少,因此你只能去三樓問他。他告訴你,我只知道fact(3) = 3*fact(2),你如果知道fact(2)就結束了,我就能告訴你答案了??墒悄悴恢纅act(2)等于多少,你只能去二樓找乙問他fact(2)等于多少。乙告訴你,我只知道fact(2) = 2*fact(1),你如果知道fact(1)等于多少就結束了,我就能告訴你答案了??墒悄悴恢纅act(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?,F在你知道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后面跟函數的時候會執行完那個函數再結束
學習計算機不容易,且學且堅持
2018-10-19
因為雖然后面的執行完了,但是問題還沒解決,整個函數還要遞歸地執行下去。直到n=1的時候才結束。也就是直到n=1的時候才return。
下面多講一些:
并不是每一個函數都要return,需要寫return有兩種情況:
一種是函數需要停止,此時只寫return;另一種是函數有數據需要返回,此時寫return+(要返回的數據)。這個問題中就是第一種情況。
再多說一點。遞歸函數的一般形式都是
if(某個條件)
{最后一步)
elif(某個條件)
{遞歸執行}
比如說這個題我也可以不用return?
寫成下面這個樣子
如果你對遞歸函數足夠了解就會發現n=2的情況是完全多余的。自己改改吧,當然不改也是對的。
2018-10-18
在函數中不論哪里遇到return語句都意味著這個函數已經執行完了,即使這個函數內后邊還有代碼也不執行了,要退出這個函數。
2018-10-18
這個return的意思是當n=1的時候只打印下面這一句話a,'-->',c整個函數就結束了,退出了。下面的語句都不執行了,下面的move()函數也就調用不到了,遞歸也就結束了。