Выбор наименьшего значения в списке с помощью рекурсии - PullRequest
0 голосов
/ 11 ноября 2018

Это функция, которую я определил, чтобы найти наименьшее значение в списке с помощью рекурсии. Однако я дважды вызывал функцию внутри себя, что, на мой взгляд, немного странно. Есть ли способ обойти функцию append() ?. Мы еще не изучали его, поэтому я спрашиваю, может ли быть более простой способ получить то же решение, не используя append()?

def minimum(lst):
    """
    parameters : lst of type list
    return : the value of the smallest element in the lst
    """
    if len(lst) == 1:
        return lst[0]

    if lst[0] < lst[1]:
        lst.append(lst[0])
        return(minimum(lst[1:]))
    return(minimum(lst[1:])) 

Ответы [ 6 ]

0 голосов
/ 29 мая 2019

В Python 3 я бы попробовал:

def minimum(lst):
    if not lst:
        return None

    a, *rest = lst

    if rest:
        b = minimum(rest)

        if b < a:
            return b

    return a

Большинство предложенных решений, за исключением @ roeen30 (+1), но включая принятое в настоящее время, не защищают себя от minimum([]). В результате многие впадают в бесконечную рекурсию!

0 голосов
/ 11 ноября 2018

Если ваша задача просто найти наименьшее значение в списке любой заданной длины, я точно не знаю, почему вы используете рекурсию. Есть более эффективные способы сделать это, такие как встроенные функции Python. Например:

list_of_ints = [4,2,7,6,8,1,5,9,2]
print(min(list_of_ints)

Это распечатает 1.

0 голосов
/ 11 ноября 2018

Вот очень явная версия, которая должна легко читаться благодаря комментариям и именам переменных.

def minimum(lst):
    # base case
    if len(lst) == 1:
        return lst[0]

    # get first element and minimum of remaining list
    first = lst[0]
    rest = lst[1:]
    min_of_rest = minimum(rest)

    # return the smaller one of those two values
    if first < min_of_rest:
        return first
    else:
        return min_of_rest
0 голосов
/ 11 ноября 2018

Использовать дополнительную переменную?

def minimum(lst, current_min=None):
    if not lst:
        return current_min
    if current_min is None:
        current_min = lst[0]
    elif lst[0] < current_min:
        current_min = lst[0]
    return minimum(lst[1:], current_min)
0 голосов
/ 11 ноября 2018

Вы можете использовать следующую программу:

def minimum(lst):
    """
    parameters : lst of type list
    return : the value of the smallest element in the lst
    """
    if len(lst) == 1:
        return lst[0]
    temp_min = minimum(lst[1:])
    if lst[0] < temp_min:
        return lst[0]
    else:
        return temp_min
0 голосов
/ 11 ноября 2018

Я думаю, вы могли бы сделать это, чтобы избежать добавления:

def minimum(lst):

    if len(lst)==1:
        return lst[0]

    if lst[0] < lst[1]:
        return minimum(lst[0:1]+ lst[2:])
    else:
        return minimum(lst[1:])

но я думаю, что этот лучше всего с одним минимальным вызовом:

def minimum(lst):        
    if len(lst) == 1:
        return lst[0]        
    s = minimum(lst[1:])

    return s if s < lst[0] else lst[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...