程式碼重寫範例

本範例展示如何使用 DeepSeek 分析和優化程式碼,包括錯誤處理、註釋和效能改進。

任務

分析並優化以下效率低下且缺乏邊界情況處理的程式碼:

def fib(n): if n <= 2: return n return fib(n-1) + fib(n-2)

提示詞

上面這段程式碼的效率很低,且沒有處理邊界情況。請先解釋這段程式碼的問題與解決方法,然後進行優化。

回應

問題分析

這段程式碼實現了一個遞迴的斐波那契數列計算函式 fib(n)。雖然程式碼簡潔,但它存在以下幾個問題:

  1. 重複計算:遞迴呼叫會導致大量的重複計算。例如,計算 fib(5) 時,fib(3)fib(2) 會被多次計算,導致效率低下。

  2. 邊界情況處理不完善:雖然程式碼中處理了 n <= 2 的情況,但沒有處理 n < 0 的情況。對於負數輸入,函式會返回不正確的結果。

  3. 遞迴深度限制:對於較大的 n,遞迴深度可能會超過 Python 的預設遞迴深度限制,導致 RecursionError

解決方法

  1. 使用記憶化(Memoization):透過快取已經計算過的斐波那契數列值,避免重複計算,提高效率。

  2. 處理邊界情況:增加對 n < 0 的檢查,並返回適當的錯誤訊息或預設值。

  3. 使用迭代代替遞迴:遞迴雖然簡潔,但在處理大規模資料時效率較低。可以使用迭代方法來計算斐波那契數列,避免遞迴深度限制。

優化後的程式碼

方法一:記憶化遞迴

def fib(n, memo={}): if n < 0: raise ValueError("輸入必須是非負整數") if n <= 2: return 1 if n in memo: return memo[n] memo[n] = fib(n-1, memo) + fib(n-2, memo) return memo[n]

方法二:迭代法

def fib(n): if n < 0: raise ValueError("輸入必須是非負整數") if n <= 2: return 1 a, b = 1, 1 for _ in range(3, n+1): a, b = b, a + b return b

解釋

  1. 記憶化遞迴

    • 使用一個字典 memo 來儲存已經計算過的斐波那契數列值
    • 在每次遞迴呼叫前,先檢查 memo 中是否已經有結果,如果有則直接返回,避免重複計算
    • 處理了 n < 0 的情況,拋出 ValueError
  2. 迭代法

    • 使用兩個變數 ab 來保存前兩個斐波那契數列值
    • 透過迴圈從 3n 計算斐波那契數列值,避免了遞迴呼叫,提高了效率
    • 同樣處理了 n < 0 的情況,拋出 ValueError

總結

優化後的程式碼不僅提高了效率,還完善了邊界情況的處理。記憶化遞迴和迭代法都是有效的優化手段,具體選擇哪種方法取決於具體需求和場景。

生成回應的程式碼

from openai import OpenAI client = OpenAI( base_url="https://api.deepseek.com/", api_key="<YOUR_API_KEY>" ) completion = client.chat.completions.create( model="deepseek-chat", messages=[ { "role": "user", "content": "上面這段程式碼的效率很低,且沒有處理邊界情況。請先解釋這段程式碼的問題與解決方法,然後進行優化。" } ] ) print(completion.choices[0].message.content)