伊莉討論區

標題: python 練習問題(遞迴) [打印本頁]

作者: 54041817    時間: 2018-8-31 11:30 AM     標題: python 練習問題(遞迴)

提示: 作者被禁止或刪除 內容自動屏蔽
作者: codewice    時間: 2018-9-1 06:40 PM

看起來像是上面少一個 return
  1. >>> def a(s, j):
  2. ...     if (j != s):
  3. ...             j+=1
  4. ...             return a(s, j)
  5. ...     else:
  6. ...             print(j)
  7. ...             return j
  8. ...
  9. >>> print(a(100,0))
  10. 100
  11. 100
  12. >>>
複製代碼

作者: johnwanz    時間: 2018-9-3 09:07 AM

從邏輯上來說, 這個遞迴程序只有最後一次, j==s的時候, 才有回傳一次;
正常走 j!=s , 在第一次的判斷中, a(s,j)執行之後, 是沒有回傳的.
作者: 54041817    時間: 2018-9-3 11:02 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 54041817    時間: 2018-9-3 11:09 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: johnwanz    時間: 2018-9-4 09:08 AM

本帖最後由 johnwanz 於 2018-9-4 09:11 AM 編輯
54041817 發表於 2018-9-3 11:09 PM
我想的就是 只要j==s才回傳  我不懂為什麼在呼叫自己函數也要回傳

遞迴是反覆地呼叫自己, 可是你只有在不呼叫自己的時候, 才有回傳.

也就是, 一直呼叫自己(j!=s), 到最後一次的時候, 因為不再呼叫自己(else)才有回傳.
而倒數第二層, 因為走的是呼叫自己的流程(else), 而這一段敘述並沒有回傳指令;
自此開始, 從倒數第二層往上, 通通都是走(j!=s)的路徑結束, 通通不具備回傳指令.

所以, 推導至首次呼叫函式, 執行完成的路徑, 走的是(j!=s), 呼叫a(s,j)路徑, 因為該段落沒有回傳, 所以自然是nothing.
作者: tryit244178    時間: 2018-11-4 04:25 PM

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

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




作者: mountainboy    時間: 2018-11-18 12:31 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 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喔,這樣程式才能有一個進入的切入點




歡迎光臨 伊莉討論區 (http://www33.eyny.com/) Powered by Discuz!