Как использовать рекурсию, чтобы найти максимальное число в списке чисел python - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в программировании и изучаю python.

В качестве упражнения я пытаюсь написать рекурсивную функцию, которая получает максимальное число в списке чисел.

Это то, что я пробовал, но работает некорректно. Может кто-нибудь посоветовать мне, что я делаю не так? Спасибо!

PS Я знаю, что этот алгоритм можно написать, взяв [1:] элементов списка, и я обнаружил это на inte rnet. Я хочу знать, что не так с моим способом делать это, чтобы я мог извлечь из этого урок. Спасибо!

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

Ответы [ 3 ]

4 голосов
/ 05 августа 2020

Ваша проблема в том, что каждый вызов 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) работают с двумя разными версиями 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
0 голосов
/ 05 августа 2020

Вот пример того, как лучше рекурсивно просмотреть этот список, используя начальный индекс (который по умолчанию равен 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))
0 голосов
/ 05 августа 2020

На самом деле вы не должны изменять массив при поиске его максимального значения (хотя 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] возвращает 3.

...