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

How to use recursive to find the maximum number in a list of numbers in python

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

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

这是我试过的方法,但不能正常工作。有人可以指导我我做错了什么吗?谢谢!

P.S。我知道这个算法可以通过获取列表元素的 [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_max_in_list 的每次调用都会通过弹出修改 data,这意味着 return number if number > get_max_in_list(data) else get_max_in_list(data) 中的两个调用 get_max_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_list(data):
    if len(data) == 1:
        return data[0]

    return data[-1] if data[-1] > get_max_in_list(data[:-1]) else get_max_in_list(data[:-1])

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

print(data)

因此,在访问列表时不要从列表中删除值,只需使用向后索引作为 [1, 2, 3][-1] returns 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))