你理解得很正确,递归函数在计算过程中确实会出现大量的重复计算。特别是在计算斐波那契数列时,像 fibRecur(9) 这样的值会被多次调用和计算。
为了帮助你更直观地理解这一点,我用一个简单的递归树来展示 fibRecur(5) 的计算过程:
fibRecur(5)
fibRecur(5)
/ \
fibRecur(4) fibRecur(3)
/ \ / \
fibRecur(3) fibRecur(2) fibRecur(2) fibRecur(1)
/ \ \
fibRecur(2) fibRecur(1) fibRecur(1)
如你所见,fibRecur(3) 和 fibRecur(2) 都被多次计算了。当 n 更大时,这种重复计算会更加严重。
为了优化这种情况,通常我们会使用记忆化递归(Memoization)或动态规划(Dynamic Programming)的方式来避免重复计算。
这里是使用记忆化递归优化的代码示例:
def fibRecurMemo(n, memo={}):
if n == 1 or n == 2:
return 1
if n in memo:
return memo[n]
memo[n] = fibRecurMemo(n-1, memo) + fibRecurMemo(n-2, memo)
return memo[n]
# 调用函数
print(fibRecurMemo(12))
这样,计算 fibRecurMemo(12) 时,每个子问题只会被计算一次,极大地提高了效率。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |