阿摩線上測驗 登入

申論題資訊

試卷:111年 - 111 經濟部所屬事業機構_新進職員甄試_統計資訊:1.資料庫及資料探勘 2.程式設計#111347
科目:國營事業◆1.資料庫及資料探勘 2.程式設計
年份:111年
排序:0

題組內容

四、有一費氏(Fibonacci)數學函式如下:(3 題,每題 5 分,共 15 分)
F(n) = F(n – 1) + F(n – 2),n > 0
F(1) = 1、F(0) = 0

申論題內容

(三)為避免因為遞迴呼叫浪費函式重複計算的時間,試修改(一)中的程式碼,仍須使用遞 迴的方式,使其計算時不須重複計算 F(n – 1)和 F(n – 2)函式。

詳解 (共 1 筆)

詳解 提供者:hchungw
要避免因遞迴呼叫浪費函式重複計算的時間,可以使用記憶化技術(Memoization)。記憶化是一種優化技術,用於加速計算機程式中冗餘計算的部分。以下是修改後使用遞迴方式並利用記憶化技術的費氏數列函式程式碼:
 
def fibonacci(n, memo=None):
    if memo is None:
        memo = {}
    if n in memo:
        return memo[n]
    if n == 0:
        result = 0
    elif n == 1:
        result = 1
    else:
        result = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
    memo[n] = result
    return result
# 測試範例
for i in range(10):
    print(f"F({i}) = {fibonacci(i)}")
解釋
使用字典作為記憶表 (Memoization Table):
在函式中添加一個參數 memo,默認值為 None。memo 用於儲存已經計算過的 F(n) 值。
在首次調用函式時,初始化 memo 為空字典。
查找記憶表:
每次計算 F(n) 時,首先檢查 n 是否在 memo 中。如果是,則直接返回 memo[n],避免重複計算。
計算和記憶:
如果 n 不在 memo 中,按照費氏數列公式計算 F(n) 的值。
將計算結果儲存在 memo[n] 中,以便後續使用。
基本情況 (Base Cases):
當 n 等於 0 時,返回 0。
當 n 等於 1 時,返回 1。
這樣的修改使得遞迴計算費氏數列時不會重複計算已經求得的值,大大提高了計算效率。