頁:
[1]
python 練習問題(遞迴)
我試著用遞迴但是好像沒有那麼順利{:1_newtoo_sad:}我在a函數裡面印出j很順利的跑出100
但是在回傳出來後他就變成None
<div></div> 看起來像是上面少一個 return>>> def a(s, j):
... if (j != s):
... j+=1
... return a(s, j)
... else:
... print(j)
... return j
...
>>> print(a(100,0))
100
100
>>>
從邏輯上來說, 這個遞迴程序只有最後一次, j==s的時候, 才有回傳一次;
正常走 j!=s , 在第一次的判斷中, a(s,j)執行之後, 是沒有回傳的. codewice 發表於 2018-9-1 06:40 PM static/image/common/back.gif
看起來像是上面少一個 return
請問為什麼要在上面那邊加回傳呢
不是只要回傳結果就好了嗎?? johnwanz 發表於 2018-9-3 09:07 AM static/image/common/back.gif
從邏輯上來說, 這個遞迴程序只有最後一次, j==s的時候, 才有回傳一次;
正常走 j!=s , 在第一次的判斷中, a( ...
我想的就是 只要j==s才回傳 我不懂為什麼在呼叫自己函數也要回傳<br><br><br><br><br><div></div> 本帖最後由 johnwanz 於 2018-9-4 09:11 AM 編輯
54041817 發表於 2018-9-3 11:09 PM static/image/common/back.gif
我想的就是 只要j==s才回傳 我不懂為什麼在呼叫自己函數也要回傳
遞迴是反覆地呼叫自己, 可是你只有在不呼叫自己的時候, 才有回傳.
也就是, 一直呼叫自己(j!=s), 到最後一次的時候, 因為不再呼叫自己(else)才有回傳.
而倒數第二層, 因為走的是呼叫自己的流程(else), 而這一段敘述並沒有回傳指令;
自此開始, 從倒數第二層往上, 通通都是走(j!=s)的路徑結束, 通通不具備回傳指令.
所以, 推導至首次呼叫函式, 執行完成的路徑, 走的是(j!=s), 呼叫a(s,j)路徑, 因為該段落沒有回傳, 所以自然是nothing....<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 本帖最後由 tryit244178 於 2018-11-4 04:27 PM 編輯
反過來寫,看會不會比較好理解。基本上和樓上大大的說明是類似的
def a(s, j)
if(s==j):
return j
return a(s, j+1)
用<= 判斷結束遞迴程序比較好,否則程式有可能不會停!
def a(s, j)
if(s<=j):
print(j)
return j
else:
return a(s, j+1) 如果還是不懂得話,去看看區域變數與全域變數之間的差別吧。 簡單來說就是你最後一次j=100時,才會return j(a(100,100)在else裡面),
但下面裡呼叫的是a(100,0)(在A的if裡面)
所以不會有值傳出來,
而且建議你要寫main喔,這樣程式才能有一個進入的切入點<br><br><br><br><br><div></div>
頁:
[1]