1-6:函式與遞迴
Function這個英文字,我們原本是使用「函數」這個中譯,但因為它在程式裡面,除了數據的計算外,還會處理資料的存取,或者是格式的轉換等,所以更常使用「函式」這個名詞。
函式通常是在程式碼開頭先做定義,隨後在主程式中呼叫它。它就像是一個忠實的僕人,隨叫隨到、使命必達,但又有點懶,事情做完一次就休息,除非你又給它第二次指令。
主程式在呼叫它的時候,得傳遞明確的訊息,它可憑此訊息進行一系列的後續處理,之後再將結果傳回主程式。
上圖中,第1行的關鍵字def,是用來定義一個函式名稱叫做singer,後面小括弧裡面的 a, b,稱為參數(parameter),要承接主程式傳過來的引數(argument),再放進第2、3行縮排的指令中處理。
第5行進入主程式中,呼叫singer函式,小括弧當中的 “Taylor” , “Leonardo”,就是引數。參數和引數的關係,就好像是變數名稱和變數值的關係,a=”Taylor”,b=”Leonardo”。
第7行到第10行,是將程式執行後輸出結果,用註解行標示出來,方便讀者閱讀。
函式裡面,要將運算結果回傳給主程式,有一個指令return很是重要。我們把先前for迴圈的加總計算,定義成函式forloop,其參數為n,它會回傳從1累加到n的總和給主程式。
上圖第7行,在主程式中呼叫forloop,並傳遞引數100給參數 n;它會從forloop函式中,利用return指令將運算結果5050回傳,指定給變數getsumm,然後再將其輸出。
return這個指令,如果能善用它,就可以建立起功能進階的遞廻函式。
所謂遞廻函式,就是函式之中的程式碼被執行的時候,又會再次呼叫函式它自己,但使用的是不同的引數。正整數階乘的計算,是個遞迴運算的典型範例。
上圖第1行定義函式fact(n),程式執行到第5行時會回傳函式本身,其參數值為n-1,外面再乘上n,這時候得到的fact(n-1),會再回傳 (n-1)*fact(n-2),而fact(n-2)又再回傳 (n-2)*fact(n-3),如此反覆呼叫fact,直到fact(1)為止,這時候已滿足第2行條件,回傳值就只有1了。執行第7行之完整遞迴過程如第11~16行所示。
先前提到的增強式學習當中,可以看到遞迴的身影。在循環修正行動值函數的時候,是援用自下一狀態的獎勵及其行動值函數,並據此援用下下次狀態,以至於最終的狀態…..。
遞廻程式的技巧,據說是在19世紀由艾達女仕所提出的,為表彰她對計算機演算法的貢獻,美國國防部開發的程式語言Ada,就是以她來命名。艾達有個大名鼎鼎的父親,英國詩人拜倫。
我們有關Python程式設計基本概念的部份,先在這裡告一段落,日後會不定期撰寫這方面的進階題材。接下來,我們將進入到「英語檢定」單元,介紹多益測驗的學習要領,歡迎有興趣的朋友繼續閱讀本社團貼文。