Переписать функцию для выполнения рекурсивно (Python) - PullRequest
1 голос
/ 03 апреля 2019

Мне нужно изменить текущую функцию empty_buckets (n), которая создает список (сегменты) с количеством n списков внутри.

Мне удалось заставить функцию уменьшаться до базового случая, но я не могу заставить ее добавлять список к каждой рекурсии

Оригинальная функция

def empty_buckets(n)
    buckets = []
    for bucket in range(n):
        buckets.append([])
        print(buckets)
    return buckets

Новая функция

def empty_buckets(n):

    buckets = []
    if n == 0:
       return buckets
    else:
        return empty_buckets(n-1), buckets.append([])

Результатом должен быть список списков, равный количеству n. Т.е. если бы n было 4, результатом было бы [[], [], [], []]

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Каждая функция имеет свою собственную копию переменной (в нашем случае это ведра). Поэтому каждый раз, когда вы вызываете метод, он заново инициализирует сегменты в пустой список и никогда не будет заполнен. Таким образом, либо вы должны передать список методу в качестве параметра, чтобы он изменил и передал его вам, либо вы должны разделить его на два метода, например:

def g(buckets):
    buckets.append([])
    return buckets

def empty(n):
    if n == 0:
        return []
    return g(empty(n - 1))
0 голосов
/ 03 апреля 2019

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

def empty_buckets(n, buckets):

    if n == 0:
       return buckets # base case - just return the buckets.
    else:
        buckets.append([]); # append a new empty list to the buckets
        return empty_buckets(n-1, buckets) # call recursion along with appended bucket list

print(empty_buckets(4, []))

EDIT Если вы не хотите передавать buckets параметру метода, тогда вы можете сделать это -

def empty_buckets(n):
    if n == 0:
       return [];
    else:
        buckets = empty_buckets(n-1); # call the recursion
        buckets.append([]) # append an empty list
        return buckets
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...