iT邦幫忙

0

python: 堆疊 return

  • 分享至 

  • xImage

1.請問第一次印完函數最後一行print(arr[n],end=" ")會繞回哪裡? 為何不會直接結束?
2.請問是因為arr[index]的index若超出範圍,才結束嗎? 為何不會出現錯誤訊息?

def f(arr):
    global n
    m = len(arr)
    print(arr[n],end=" ")
    if (n < m-1):
        n = n+1
        f(arr)
    else:
        return 
    # print('hello')
    n = n -1  #第一次到此處是n = 3
    print(arr[n],end=" ") # 第一次在這印出arr[2],下一步要回去哪裡??? 為何不是從這就結束?
    
n = 0
arr = ["a","b","c","d"]
f(arr)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
海綿寶寶
iT邦大神 1 級 ‧ 2022-04-04 15:58:10
最佳解答

呼叫函式(function)都是「一組」call/return
修改程式以顯示程式執行流程如下
https://ithelp.ithome.com.tw/upload/images/20220404/200017877OL7bZxi2R.png

另外
這程式比較常用「遞迴」而非「堆疊」來形容

crazy iT邦新手 5 級 ‧ 2022-04-05 22:25:51 檢舉

海綿寶寶
謝謝您的解惑,不過有個地方沒弄懂。return下面那幾行,為何還跑了3次呢?為何是到了n=0才結束而不是n=2就結束?

def f(arr):
    global n
    m = len(arr)
    print(arr[n],end=" ")
    if (n < m-1):
        n = n+1
        f(arr)
    else:
        return 

    n = n -1  
    print(arr[n],end=" ") 
    #為何當跑到n=3跳出if/else後,來到這裡印出arr[2]沒有直接結束呢???
    
n = 0
arr = ["a","b","c","d"]
f(arr)

呼叫函式(function)都是「一組」call/return
此程式 call 了四次
所以也有四次 return
不過只有一次是 else 裡的 return
其他三次都是 function 最後的 return
用 return-1 和 return-2 來區分

crazy iT邦新手 5 級 ‧ 2022-04-08 14:10:00 檢舉

謝謝您

0
camelcheng
iT邦新手 4 級 ‧ 2022-04-04 23:14:44

這是一個遞迴的函數,google查recursive應該很多,我下方會多一些註解你再看看

def f(arr):
    global n
    m = len(arr)  
    #第一次進來時,arr=["a","b","c","d"],m=4
    if (n < m):    #第一次n=0 m=4, 所以0<4會進入這邊
        #當n=4時,因為不會進到裡面,所以不會超過arr的index範圍
        print(arr[n],end=" ")   
        n = n+1
        f(arr)     #第二次呼叫n=1 arr = ["a","b","c","d"]
        #第三次呼叫n=2 arr = ["a","b","c","d"]
        #第四次呼叫n=3 arr = ["a","b","c","d"]
    else:
        return     #當n=4時就會出去此函數就結束
    
n = 0
arr = ["a","b","c","d"]
f(arr)   #第一次呼叫n=0 arr = ["a","b","c","d"]
ragequit iT邦新手 5 級 ‧ 2022-04-06 09:05:40 檢舉

回錯地方

crazy iT邦新手 5 級 ‧ 2022-04-08 14:09:46 檢舉

謝謝您

0
ragequit
iT邦新手 5 級 ‧ 2022-04-06 09:07:26

其實你可畫個圖出來應該會很清楚流程,你執行到底下n=3-1後print(arr[2])。該fun結束,從上一層的f(arr)後繼續執行n=n-1,變成n=2-1後print(arr[1]),直到最一開始的n=0那層。
所以思路是,第一層n=0 第二層n=1 第三層n=2 第四層n=3,第四層 return --> print(n=3-1) --> print(n=2-1) --> print(n=1-1)

crazy iT邦新手 5 級 ‧ 2022-04-08 14:09:32 檢舉

謝謝您

我要發表回答

立即登入回答