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

时间:2012-10-03 15:07:48

标签: 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()

或许我想打开一个包含数字的txt文件,然后使用递归?

我相信递归就像这样

def function()
> if something:
>>return 0
>else:
>>return function()

12 个答案:

答案 0 :(得分:13)

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

你的if-block搞砸了,你有两个else到一个if并且对齐已经完成。您需要删除第一个else并取消缩进if一级以下的所有内容。例如:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

基本方法就是这样。

  1. 如果列表只包含一个元素,则该元素为最大值。立即归还。
  2. 否则,该列表包含多个元素。列表中的第一个元素是最大元素,或者不是。
  3. 第一个元素的最大值只是列表中的第一个元素。
  4. 以其他方式(除了第一个元素之外的所有元素)递归调用Max以找到这些元素的最大值。
  5. 比较步骤3和4的结果。结果是数字越大。归还。
  6. 现在你有一些语法错误。例如,对于单个else,您有两个if子句,缩进看起来很有趣。 else块只能有一个if。但是,如果您按照这些说明操作,则应该有一个有效的算法。

答案 3 :(得分:2)

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

假设我们尝试从 n 元素的 S 序列中查找并返回最大元素。

功能原型: Max(S, n)

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

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

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

Recursion trace

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

最后这是工作代码:

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个大多数元素的序列。

  

为了对抗无限递归,Python的设计者做了一个   故意决定限制功能的总体数量   可以同时激活的激活。精确的价值   此限制取决于Python分发,但是典型的默认值   值为1000。如果达到此限制,则为Python解释器   使用RuntimeError消息提出maximum recursion depth exceeded

     

Michael T. Goodrich(2013),Data Structures and Algorithms in Python,Wiley

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

import sys
sys.setrecursionlimit(1000000)

答案 4 :(得分:1)

def Max(lis,maxx=-float("inf")):

    if len(lis) == 1:            #only one element in lis
        return maxx if maxx>lis[0] else lis[0]  #return lis[0] if it's greater than maxx

    else:
        m=lis[0] if lis[0]>maxx else maxx  # m = max(lis[0],maxx)
        return Max(lis[1:],m)              #call Max with lis[1:] and pass 'm' too

print Max([1,2,39,4,5,6,7,8]) #prints 39
print Max([1,2,3,4,5,6,7,8]) #prints 8   

答案 5 :(得分:1)

这些解决方案在某些列表大小后失败。

这是一个更好的版本:

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

答案 6 :(得分:0)

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

这是一个可以正常工作的功能:

a = [1,233,12,34]

def find_max(a):
    return sorted(a)[-1]

答案 7 :(得分:0)

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

答案 8 :(得分:0)

你也可以这样做:

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)

答案 9 :(得分:0)

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, ]))

答案 10 :(得分:-1)

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

def max_value(n_list):
    return n_list[0] if len(n_list) == 1 else max(n_list[0], max_value(n_list[1:]))

答案 11 :(得分:-3)

def getMaxNumber(numbers): 
    return 'N.A' if len(numbers) == 0 else max(numbers)