При использовании рекурсии список не будет добавлять новые элементы - PullRequest
0 голосов
/ 11 ноября 2018

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

def double(lst, lst_ = []):
    """
    parameters : lst of type list;
    returns : another list with lst's elements doubled
    """
    if len(lst) == 0:
        return lst_
    else:
        lst[0] = int(lst[0]) + int(lst[0])
        lst_ = lst_ + lst[0:1]            
        print(lst_)
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))

Это вывод

[2]
[4]
[6]
[8]
[10]
[12]
[14]
[16]
[]

Ответы [ 4 ]

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

Если вы не хотите использовать append (). Тогда вы можете использовать это решение:

def double(lst, lst_ = []):
    if not lst:
        return lst_
    else:
        return [lst[0] * 2 , *double(lst[1:])]

print(double([1,2,3,4,5,6,7,8]))

Вывод будет: [2, 4, 6, 8, 10, 12, 14, 16]

На всякий случай, если вам интересно с вызовом * double (lst [1:]): * [] используется для распаковки списка аргументов. Подробнее здесь. Если вы позвоните без *, вы получите вывод:

[2, [4, [6, [8, [10, [12, [14, [16, []]]]]]]]]

Еще одним простым решением будет:

def double(lst, lst_ = []):
    if not lst:
        return lst_
    else:
        lst[0] = lst[0] * 2
        lst_ = lst_.append(lst[0])
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))
0 голосов
/ 11 ноября 2018

Используйте .append() в списке для добавления элементов в конце:

def double(lst, lst_ = []):
    """
    parameters : lst of type list;
    returns : another list with lst's elements doubled
    """
    if len(lst) == 0:
        return lst_
    else:
        lst[0] += lst[0]
        lst_.append(lst[0])          
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))
# [2, 4, 6, 8, 10, 12, 14, 16]

Также обратите внимание, что эта строка lst[0] = int(lst[0]) + int(lst[0]) в вашем коде может быть сокращена до lst[0] += lst[0], поскольку вы имеете дело только с целыми числами и явное приведение является избыточным.

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

Если идея состоит в том, чтобы вернуть копию без изменения оригинала, я бы не рекомендовал использовать изменяемый аргумент по умолчанию.

Вместо

def double(lst):
    if not lst:
        return []
    return [2*lst[0], *double(lst[1:])] # [2*lst[0]] + double(lst[1:]) 

Рекурсивный регистр должен возвращать новый список, а базовый регистр проверяет и возвращает пустой список.

lst1 = double([1,2,3,4,5,6,7,8]) 
print(lst1)
[2, 4, 6, 8, 10, 12, 14, 16]

Если вы хотите немного повеселиться, вы можете попробовать рекурсивное решение на основе генератора, используя yield from (делегирование генератора):

def double(lst):
    if lst:
        yield 2*lst[0]
        yield from double(lst[1:])

lst = list(double([1,2,3,4,5,6,7,8]) )
print(lst)
[2, 4, 6, 8, 10, 12, 14, 16]
0 голосов
/ 11 ноября 2018

Попробуйте так:

def double(lst, lst_ = []):
  if len(lst) == 0:
    return lst_
  else:
    lst[0] = int(lst[0]) + int(lst[0])
    lst_.extend(lst[:1])
    return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))

#=> [2, 4, 6, 8, 10, 12, 14, 16]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...