查看完整版本: python 練習問題(遞迴)
頁: [1]

54041817 發表於 2018-8-31 11:30 AM

python 練習問題(遞迴)

我試著用遞迴但是好像沒有那麼順利{:1_newtoo_sad:}

我在a函數裡面印出j很順利的跑出100
但是在回傳出來後他就變成None

<div></div>

codewice 發表於 2018-9-1 06:40 PM

看起來像是上面少一個 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
>>>

johnwanz 發表於 2018-9-3 09:07 AM

從邏輯上來說, 這個遞迴程序只有最後一次, j==s的時候, 才有回傳一次;
正常走 j!=s , 在第一次的判斷中, a(s,j)執行之後, 是沒有回傳的.

54041817 發表於 2018-9-3 11:02 PM

codewice 發表於 2018-9-1 06:40 PM static/image/common/back.gif
看起來像是上面少一個 return

請問為什麼要在上面那邊加回傳呢
不是只要回傳結果就好了嗎??

54041817 發表於 2018-9-3 11:09 PM

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:08 AM

本帖最後由 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:25 PM

本帖最後由 tryit244178 於 2018-11-4 04:27 PM 編輯

反過來寫,看會不會比較好理解。基本上和樓上大大的說明是類似的
def a(s, j)
   if(s==j):
      return j
   return a(s, j+1)


mountainboy 發表於 2018-11-18 12:31 AM

用<= 判斷結束遞迴程序比較好,否則程式有可能不會停!
def a(s, j)
   if(s<=j):
      print(j)
      return j
   else:
      return a(s, j+1)

zxcv3316822 發表於 2019-2-2 10:44 PM

如果還是不懂得話,去看看區域變數與全域變數之間的差別吧。

3iljw 發表於 2019-3-20 03:27 PM

簡單來說就是你最後一次j=100時,才會return j(a(100,100)在else裡面),
但下面裡呼叫的是a(100,0)(在A的if裡面)
所以不會有值傳出來,
而且建議你要寫main喔,這樣程式才能有一個進入的切入點<br><br><br><br><br><div></div>
頁: [1]