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

Python:用于查找列表中最大数字的递归函数,python,recursion,Python,Recursion,我正试图做一个来自教科书Zelle Python编程的实验工作 这个问题要求我“编写并测试一个递归函数max(),以找到列表中的最大值。max是第一项和所有其他项中的较大值。”我不太理解教科书中的问题 def Max(list): if len(list) <= 1: else: return list[0] else: m = Max(list[1:]) return m if

我正试图做一个来自教科书Zelle Python编程的实验工作

这个问题要求我“编写并测试一个递归函数
max()
,以找到列表中的最大值。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()

您对递归工作原理的理解似乎很好

如果if块出错,则两个
else
s与一个
if
对齐失败。您需要删除第一个
else
,如果
为一级,则取消缩进
下的所有内容。例如:

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()

基本方法是这样的

  • 如果列表仅包含单个元素,则该元素为最大值。立即返回该元素
  • 否则,列表将包含多个元素。列表中的第一个元素要么是最大值,要么不是
  • 第一个元素的最大值就是列表中的第一个元素
  • 递归调用其余元素(除第一个元素外的所有元素)的
    Max
    ,以查找这些元素的最大值
  • 比较步骤3和步骤4的结果。结果是一个更大的数字。归还它

  • 现在您有一些语法错误。例如,对于单个
    if
    ,您有两个
    else
    子句,缩进看起来很有趣。对于
    if
    块,只能有一个
    else
    。但是,如果您按照这些说明进行操作,您应该有一个有效的算法。

    这里是解决上述问题的另一种方法

    def maximum(L):
        if len(L) == 1:
            return L[0]
        else:
            return max(L[0],maximum(L[1:]))
    
    因此,示例输入和输出:

    L= [2,4,6,23,1,46]
    print maximum(L)
    
    产生

    46
    

    这些解决方案在特定的列表大小后失败

    这是一个更好的版本:

    def maximum2(a, n):
        if n == 1:
            return a[0]
        x = maximum2(a[n//2:], n - n//2)
        return x if x > a[0] else a[0]
    def maximum(a):
        return maximum2(a, len(a))
    
    maximum(range(99999))
    
    
    >>> 99998
    

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

    假设我们试图从S序列中找到并返回n个元素中的最大元素

    功能原型:
    Max(S,n)

    基本大小写:如果S只包含一个项目,请将其返回。(很明显,序列中唯一的项目是最大值。)

    重复:如果不是基本情况,则每次调用
    Max
    以减少一个项目,即调用
    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)) 
    
    注意:递归实现在默认情况下仅适用于包含1000个most元素的序列

    为了对抗无限递归,Python的设计者提出了一个 有意决定限制函数的总数 可以同时激活的激活。精确的价值 此限制取决于Python发行版,但这是一个典型的默认值 值为
    1000
    。如果达到此限制,Python解释器 引发
    运行时错误
    ,并显示一条消息,
    超过最大递归深度

    Michael T.Goodrich(2013),Wiley

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

    import sys
    sys.setrecursionlimit(1000000)
    

    一种简单的方法是先对列表排序,然后使用索引

    下面是一个可以工作的函数:

    a = [1,233,12,34]
    
    def find_max(a):
        return sorted(a)[-1]
    

    这是我的答案,只有一行代码:))


    您也可以这样做:

    def maximum(data, start, stop):
    
        if start >= stop:
                return data[start]
    
        else:
                if data[start] >= data[stop - 1]:
                    return maximum(data, start, stop - 1)
    
                else:
                    return maximum(data, start + 1, stop)
    
    测试:


    问题是什么?不清楚。很抱歉,问题来自教科书,所以我不知道如何澄清。第一个
    if
    案例只有在
    列表==[]
    时才有效,它没有
    0
    第th元素。不得不承认,除了明显的错误之外,我没有仔细检查代码!谢谢你给我解释你的答案。所以存在不仅是为了回答问题,而且是为了教学。感谢您的回答,虽然您的代码可能有效,但请包括一个简短的解释,说明代码正在做什么。这有助于用户更好地理解它。谢谢,希望这些评论能有所帮助:)很棒的文章,乔治。我想再问一个问题。我的代码如下:def large(x):if len(x)==1:返回x.pop(0)else:temp=x.pop(0)previous=large(x)if previous>=temp:return previous else:return temp;它可以工作,但是如果我使用def-large(x):if-len(x)==1:return x.pop(0)else:temp=x.pop(0)if-large(x)>=temp:return-large(x)else:return-temp(0)。它将返回错误。你介意把它弄清楚吗?谢谢。
    import sys
    sys.setrecursionlimit(1000000)
    
    a = [1,233,12,34]
    
    def find_max(a):
        return sorted(a)[-1]
    
    def find_max(arr):
      """find maximum number in array by recursion"""
      if arr == []: # if its an empty array
        return 0
      if len(arr) == 1: # if array has only one element
        return arr[0]
      else: # get max of first item compared to other items recursively
        return max(arr[0], find_max(arr[1:])) # 1: means all other excluding 0th element
    
    def main():
      print(find_max([2,3,5,6,7,1])) # will print max - 7
    
    if __name__ == "__main__":
      main()
    
    def max_value(n_list):
        return n_list[0] if len(n_list) == 1 else max(n_list[0], max_value(n_list[1:]))
    
    def maximum(data, start, stop):
    
        if start >= stop:
                return data[start]
    
        else:
                if data[start] >= data[stop - 1]:
                    return maximum(data, start, stop - 1)
    
                else:
                    return maximum(data, start + 1, stop)
    
    def recursiveMax(a):
        if len(a) == 1:
            return a[0]
        else:
            return a[0] if a[0] > recursiveMax(a[1:]) else recursiveMax(a[1:])
    
    print(recursiveMax([1, 2, 15, 6, 3, 2, 9]))
    print(recursiveMax([98, 2, 1, 1, 1, 1, ]))