作者micangela (嘟)
看板Python
標題Re: [問題]一個 遞迴的 return問題
時間Fri Apr 8 10:34:33 2016
有趣的問題。 從Python bytecode來看有細微的差別。
以下是用Python2.7跑的實驗。
結果是第一個寫法多了一些東西,
但我猜很難對效能產生大影響。
===
實驗一
import dis
def f(i):
if i == 0: return
print(i)
f(i-1)
dis.dis(f)
實驗二
import dis
def f(i):
if i == 0: return
print(i)
return f(i-1)
dis.dis(f)
結果一
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 POP_TOP
35 LOAD_CONST 0 (None)
38 RETURN_VALUE
結果二
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 RETURN_VALUE
※ 引述《sunnoset (skj)》之銘言:
: f(10)
: 和
: def f(i):
: if i == 0: return
: print(i)
: return f(i-1)#加上return
: f(10)
: 執行結果一樣
: 10
: 9
: 8
: 7
: 6
: 5
: 4
: 3
: 2
: 1
: 但我好奇在背景是否有差別呢?
: 謝謝指教
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 70.114.251.20
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1460082875.A.53F.html
推 Yshuan: 因為沒return的情況 是當作return None 04/08 10:55
→ Yshuan: 誠實說 我不太理解為何要把這問題和遞迴併一起討論 04/08 10:56