Python函数中的无限递归问题,如果参数过长

3
我写了一个递归函数,用于返回整数列表中的最大值:
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]) 会导致无限递归。为什么?

为什么你认为发生了无限递归? - Tymoteusz Paul
有人比我更快地回答这种问题,但我必须问一下:你是否在其中加入了打印语句以查看它的运行情况?这肯定会告诉你答案的。 - GreenAsJade
+1 TIL Python3 中的函数注解 ;) - zhangxaochen
1个回答

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

这不仅仅是调用函数两次递归,我不确定增长率的确切情况,但似乎是指数级增长,因为每个额外的递归调用将会产生更多的额外递归调用。


我是一名新手,之前从未遇到过类似于Python中的def max_r(l: [int]) -> int:这样的写法。请问我应该去哪里了解更多相关信息? - Roberto
1
@Roberto 我其实不确定,但可能是某个修改过的解释器或编辑器,允许你提供类型提示以获得更好的静态分析和/或代码完成。 - Andrew Clark
5
这是符合Python 3语法的。它们被称为注释,在文档中可以阅读相关内容:http://docs.python.org/3/reference/compound_stmts.html#function-definitions - kwatford
成功了。我没有想到要将递归调用绑定到名称上。谢谢! - austinsherron
1
澄清一下:该函数在每个步骤中调用了两次自身,总共调用了2 ** len(lst) - 1次。F.J的修改只在每个步骤中调用一次,总共调用了len(lst) - 1次。在样本数据上,这是46次函数调用,而不是140.7万亿次调用。 - Hugh Bothwell
1
这些基本的工具,例如打印语句,会立刻显示出来的。 - GreenAsJade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接