Python:递归函数,用于查找列表中的最大数字

Jim*_* Ly 2 python recursion

我正在尝试从教科书Zelle Python Programming做一个实验室工作

这个问题让我"编写并测试一个递归函数max()来查找列表中的最大数字.最大值是第一个项目中的较大项目和所有其他项目中的最大项目." 我不太明白教科书中的问题.

def Max(list):
    if len(list) <= 1:
        else:
            return list[0]
        else:
            m = Max(list[1:])
            return m if m > list[0] else list[0]

def main():
    list = eval(raw_input(" please enter a list of numbers: "))
    print("the largest number is: ", Max(list))

main()
Run Code Online (Sandbox Code Playgroud)

或者也许我想打开一个带有数字的txt文件,然后使用递归?

我相信这样的递归工作

def function()
> if something:
>>return 0
>else:
>>return function()
Run Code Online (Sandbox Code Playgroud)

jam*_*jam 13

你对递归如何工作的理解似乎很好.

你的if-block搞砸了,你有两个elses if对齐,对齐就出来了.你需要elseif一个级别下删除你的第一个和非缩进的一切.例如:

def Max(list):
    if len(list) == 1:
        return list[0]
    else:
        m = Max(list[1:])
        return m if m > list[0] else list[0]

def main():
    list = eval(raw_input(" please enter a list of numbers: "))
    print("the largest number is: ", Max(list))

main()
Run Code Online (Sandbox Code Playgroud)

  • 第一个“if”情况仅在“list == []”时才有效,它没有第“0”个元素。 (2认同)

Geo*_*kas 5

我发布了一个不同的问题解决方法。大多数答案在每次递归调用中使用切片运算符操作列表。当练习没有提供要使用的严格函数原型时,我还将列表的长度作为函数参数传递。

假设我们试图找到并从序列返回的最大元素小号的,ñ元素。

函数原型: Max(S, n)

基本情况:如果S只包含一项,则返回它。(显然,序列中唯一的项目是最大的项目。)

重复:如果不是基本情况,则Max每次调用少一个项目,即 call Max(S, n-1)。然后,我们将返回值存储到一个名为的变量中,该变量previous指示序列中的前一个元素,并使用序列中的下一个元素(即当前递归调用中最右边的元素)检查该值,并返回这些值的最大值。

下图给出了上述过程的递归跟踪。假设我们尝试从包含 的列表中找到最大值[5, 10, 20, 11, 3]

递归跟踪

注意:为了进一步帮助您,请记住我们从最右边的元素到最左边的元素递归地迭代列表。

最后是工作代码:

def find_max_recursively(S, n):                                                
    """Find the maximum element in a sequence S, of n elements."""             
    if n == 1:  # reached the left most item                                   
        return S[n-1]                                                          
    else:                                                                      
        previous = find_max_recursively(S, n-1)                                
        current = S[n-1]                                                       
        if previous > current:                                                 
            return previous                                                    
        else:                                                                  
            return current                                                     


if __name__ == '__main__':                                                     
    print(find_max_recursively([5, 10, 20, 11, 3], 5)) 
Run Code Online (Sandbox Code Playgroud)

注意:默认情况下,递归实现仅适用于最多 1000 个元素的序列。

为了对抗无限递归,Python 的设计者有意决定限制可以同时激活的函数激活的总数。此限制的精确值取决于 Python 分布,但典型的默认值为1000. 如果达到此限制,Python 解释器将引发RuntimeError带有消息maximum recursion depth exceeded.

Michael T. Goodrich (2013),Python 中的数据结构和算法,Wiley

要更改默认值,请执行以下操作:

import sys
sys.setrecursionlimit(1000000)
Run Code Online (Sandbox Code Playgroud)