我正在阅读数据结构和算法书,在递归章节中,我遇到了以下算法:
def binary_sum(S, start, stop):
if start >= stop:
return 0
elif start == stop-1:
return S[start]
else:
mid = (start + stop) // 2
return binary_sum(S, start, mid) + binary_sum(S, mid, stop)
作者认为这比线性和更有效:
def linear_sum(S, n):
if n == 0:
return 0
else:
return linear_sum(S, n-1) + S[n-1]
因为在迭代的每一步,我们将求和的范围减半(在中间分开),这意味着我们占用O(log n)
空间。图片如下:
我的理解是,当我们递归时,对递归步骤的调用会暂停执行,并且其激活记录仍保留在内存中。难道这并不意味着我们实际上占用了带有binary_sum的2^n
内存空间吗?
谢谢,
答案 0 :(得分:2)
作者是正确的,因为调用堆栈的深度是对数限制的。
在您提供的示例中,每次最多可以在堆栈上进行4次调用。他们并非都在附近。当我们开始执行1:2
时,我们已经完成0:1
并将其从堆栈中删除。同样,我们完成0:2
,然后开始2:4
。当我们执行2:4
时,我们不会为0:2
使用任何空格,因为它已完成。在我们完成目前正在处理的工作之前,我们也不会将任何空间用于4:8
之类的未来通话。