如何在python中使用递归查找数字列表中的最大数字

如何在python中使用递归查找数字列表中的最大数字,python,list,algorithm,recursion,max,Python,List,Algorithm,Recursion,Max,我是编程新手,正在学习python 作为练习,我尝试编写一个递归函数,以获取数字列表中的最大数字 这是我尝试过的,但它不能正常工作。有人能告诉我我做错了什么吗?谢谢大家! def get_max_in_list(data): if len(data) == 1: return data[0] number = data.pop() return number if number > get_max_in_list(data) else get_max

我是编程新手,正在学习python

作为练习,我尝试编写一个递归函数,以获取数字列表中的最大数字

这是我尝试过的,但它不能正常工作。有人能告诉我我做错了什么吗?谢谢大家!

def get_max_in_list(data):
    if len(data) == 1:
        return data[0]
    number = data.pop()
    return number if number > get_max_in_list(data) else get_max_in_list(data)

data = [2, 6, 8, 3]
print(get_max_in_list(data))
另外,我知道这个算法可以通过获取[1:]个列表元素来编写,我在互联网上发现了这一点。我想知道我的做事方式有什么问题,这样我就能从中吸取教训。谢谢大家!

def get_max_in_list(data):
    if len(data) == 1:
        return data[0]
    number = data.pop()
    return number if number > get_max_in_list(data) else get_max_in_list(data)

data = [2, 6, 8, 3]
print(get_max_in_list(data))

您的问题是,
get\u max\u in_list
的每个调用都会弹出修改
data
,这意味着
get\u max\u in_list(data)
中的两个调用
return number if number>get\u max\u in_list(data)
在两个不同版本的
data
上运行。您可以通过存储值来解决这个问题,这样您只需要调用它一次,但更好的选择是不修改输入

def get_max_in_list(data):
    if len(data) == 1:
        return data[0]
    number = data.pop()
    m = get_max_in_list(data)
    return number if number > m else m

在查找数组的最大值时,实际上不应该修改数组(尽管list.pop正在这样做)。也许你的想法最适合你

def get_max_in_列表(数据):
如果len(数据)==1:
返回数据[0]
如果数据[-1]>获取列表中的最大值(数据[:-1]),则返回数据[-1],否则获取列表中的最大值(数据[:-1])
数据=[2,6,8,3]
打印(获取列表中的最大值(数据))
打印(数据)

因此,不必在访问列表时从列表中删除值,只需使用反向索引,因为
[1,2,3][1]
返回3。

下面是一个示例,说明如何更好地使用开始索引(第一次调用时默认为0)在该列表上递归,而无需修改列表或从中复制切片:

def get_max_in_list(data, start_index=0):
    if start_index == len(data) - 1:
        return data[start_index]
    number = data[start_index]
    result = get_max_in_list(data, start_index + 1)
    return number if number > result else result

data = [2, 6, 8, 3]
print(get_max_in_list(data))

“不能正常工作”并没有告诉我们任何事情……警告:不管正确性如何,不需要修改列表的函数都不应该修改它
pop
从列表中删除元素,运行函数后得到的数据将与开始时的数据大不相同。警告2:您提到的使用切片的解决方案是一个坏主意,因为每个切片都会创建列表一部分的副本,并且会堆积在内存中。如果必须在列表上递归,请改用索引和默认值。