我编写了这个递归函数,它返回整数列表中的最大值:
def max_r(l: [int]) -> int:
if len(l) == 1:
return l[0]
else:
return l[0] if max_r(l[1:]) < l[0] else max_r(l[1:])
电话max_r([1,4,3,2,3,4,89,2,30,1]
会返回89
,但会在更长的列表中调用该函数:
max_r([96, 84, 87, 81, 94, 74, 65, 42, 45, 76, 5, 37, 86, 8, 46, 54, 62, 63, 35, 85, 16, 23, 18, 57, 51, 90, 58, 33, 47, 10, 64, 49, 67, 29, 71, 30, 9, 99, 75, 3, 97, 32, 59, 25, 27, 72, 61])
导致无限递归。为什么呢?
答案 0 :(得分:2)
它不是无限递归,但是当你不需要时,你正在进行两次相同的递归调用。似乎可以通过以下更改快速完成:
def max_r(l: [int]) -> int:
if len(l) == 1:
return l[0]
else:
result = max_r(l[1:])
return l[0] if result < l[0] else result
这不仅仅是递归调用函数两次的问题,我不确定确切的增长率,但它似乎是指数的,因为每个额外的递归调用将进行更多额外的递归调用。