###### tags: `程式設計` # 第八週 ## 秘密暨南文章共享 <iframe src="https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2FNCNUSecrets2.0%2Fposts%2F1135119166854159&width=500" width="500" height="223" style="border:none;overflow:hidden" scrolling="yes" frameborder="0" allowTransparency="true" allow="encrypted-media"></iframe> ## 遞迴 ![](https://i.imgur.com/761Zh7d.png) ### 遞迴的三大要件(步驟) 1. 函式的規格(參數) 2. 完成條件(終止條件) 3. 化簡(呼叫自己)的方法 ### 費氏數列 1. 參數 `n` 代表費氏數列的第幾項 2. 完成條件,當 `n` <= 1 時,其值為n 3. 化簡方法,F(n - 1) + F(n - 2) `n` 代表要找費氏數列的第 `n` 個序列 ```python def F(n) : if n <= 1 : return n return F(n - 1) + F(n - 2) ``` ### 河內塔問題 ```python #定義 Hanoi 函數的規格 #n: 有幾個 disc(碟片) 要移動 #src: 來源柱子 (source) #dest: 目的柱 (destination) #third: 另一根柱子 #result: 每根柱子的 disc 號碼 def Hanoi(n, src, dest, third, result) : if n == 0 : print(*result[0], end=' ') print(*result[1], end=' ') print(*result[2]) print('-----------------') return # 假設一共有 3 個盤子要移 # 從第 0 根柱子移到第 1 根柱子 # 要先做的事情是 # 把 n - 1 個盤子移動到第 2 根柱子 # (最大盤子上面被兩個盤子壓住,要移動前要先把他們移走) # 把最大的盤子從 0 移到 1 # 把剛剛移走的兩個盤子從 2 移到 1 # 上面是第一層步驟 # 因為一次不能移動多個盤子 # 所以要移動 2 個盤子的情況,又會再分步驟出去 # 步驟 1 : move n-1 discs, from src to third Hanoi(n-1, src, third, dest, result) # 步驟 2 : move one disc, from src to dest result[dest].append(result[src].pop()) # 步驟 3 : move n-1 disc, from third to dest Hanoi(n-1, third, dest, src, result) def main() : n = int(input()) Hanoi(n, 0, 1, 2, [[n-i for i in range(n)],[],[]]) if __name__ == '__main__' : main() ``` ## 組合 ```python= # 給個 list,請取出所有 m 個的組合 # eg ABCDE,取出所有三 3 個的組合 # 有 5 種選擇, # 選A, 然後給下一位同學(BCDE, 2, A) # 選B, -->(CDE, 2, B) # 選C, -->(DE, 2, C) # data : 可選清單 # m : 要選幾個 # result : 前面同學已經選好的東西 def comb(data, n, result) : if m == 0 : print(*result) return for i in range(len(data)) : # 每個位置都有機會被選一次 comb(data[i + 1:], m - 1, result+[data[i]]) def main() : # 讀入要組合的字串 data = input().split() # 輸入要取幾個字母 n = int(input()) comb(data, n, []) if __name__ == '__main__' : main() ``` ## 忍術算術填入術 ```python= def findNum(data, m, result)) ; if m == 0 : first_line = result[0]*10+result[1] second_line = result[2] third_line = result[3]*10+result[4] forth_line = result[5]*10+result[6] fifth_line = result[7]*10+result[8] if first_list * second_line == third_line and third_line + forth_line == fifth_line : print(*result) return for i in range(len(data)) : findNum(data[:i]+data[i+1:], m-1, result+[data[i]]) def main() : findNum([i+1 for i in range(9)], 9, []) if __name__ == '__main__' : main() ```