程式碼重寫範例
本範例展示如何使用 DeepSeek 分析和優化程式碼,包括錯誤處理、註釋和效能改進。
任務
分析並優化以下效率低下且缺乏邊界情況處理的程式碼:
def fib(n):
if n <= 2:
return n
return fib(n-1) + fib(n-2)
提示詞
上面這段程式碼的效率很低,且沒有處理邊界情況。請先解釋這段程式碼的問題與解決方法,然後進行優化。
回應
問題分析
這段程式碼實現了一個遞迴的斐波那契數列計算函式 fib(n)
。雖然程式碼簡潔,但它存在以下幾個問題:
-
重複計算:遞迴呼叫會導致大量的重複計算。例如,計算
fib(5)
時,fib(3)
和fib(2)
會被多次計算,導致效率低下。 -
邊界情況處理不完善:雖然程式碼中處理了
n <= 2
的情況,但沒有處理n < 0
的情況。對於負數輸入,函式會返回不正確的結果。 -
遞迴深度限制:對於較大的
n
,遞迴深度可能會超過 Python 的預設遞迴深度限制,導致RecursionError
。
解決方法
-
使用記憶化(Memoization):透過快取已經計算過的斐波那契數列值,避免重複計算,提高效率。
-
處理邊界情況:增加對
n < 0
的檢查,並返回適當的錯誤訊息或預設值。 -
使用迭代代替遞迴:遞迴雖然簡潔,但在處理大規模資料時效率較低。可以使用迭代方法來計算斐波那契數列,避免遞迴深度限制。
優化後的程式碼
方法一:記憶化遞迴
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
解釋
-
記憶化遞迴:
- 使用一個字典
memo
來儲存已經計算過的斐波那契數列值 - 在每次遞迴呼叫前,先檢查
memo
中是否已經有結果,如果有則直接返回,避免重複計算 - 處理了
n < 0
的情況,拋出ValueError
- 使用一個字典
-
迭代法:
- 使用兩個變數
a
和b
來保存前兩個斐波那契數列值 - 透過迴圈從
3
到n
計算斐波那契數列值,避免了遞迴呼叫,提高了效率 - 同樣處理了
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)