亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么=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)就結束了,我就能告訴你答案了??墒悄悴恢纅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后面跟函數的時候會執行完那個函數再結束

學習計算機不容易,且學且堅持

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
  • 參與學習       758392    人
  • 解答問題       8967    個

學python入門視頻教程,讓你快速入門并能編寫簡單的Python程序

進入課程

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

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號