Возвращаемое значение функции при вызове другой функции - PullRequest
0 голосов
/ 23 апреля 2020

Это то, с чем я сталкиваюсь, пытаясь ответить на вопрос LeetCode. Я написал функцию для вызова другой рекурсивной функции.

Это способ правильного вывода.

def generateParenthesis(self, n: int) -> List[str]:
    right = n
    left = n
    item = ''
    result = []
    self.helper(item, left, right, result)
    return result

def helper(self, item, l, r, result):

    if l==0 and r==0:
        return result.append(item)
    else:
        if l > r:
            return
        else:
            if l > 0:
                self.helper(item+'(', l-1,r, result)
            if r > 0:
                self.helper(item+')', l, r-1, result)

Однако, когда я изменю первую функцию на эту, я получу пустой список [].

def generateParenthesis(self, n: int) -> List[str]:
    right = n
    left = n
    item = ''
    result = []
    return self.helper(item, left, right, result)

Не могу понять, как работает возврат в функции, вам нужна помощь от вас, ребята.

1 Ответ

0 голосов
/ 23 апреля 2020

Функция helper, как показано в вашем исходном коде, использует хвостовую рекурсию . Это видно из того факта, что функция helper по существу хранит информацию из предыдущего рекурсивного вызова в своем параметре аргумента; следовательно, аргументы обновляются в каждом рекурсивном вызове.

Но даже если это понятие вам чуждо, как указывает @ 63677, мы можем начать с наблюдения, что функция helper ничего не возвращает. Может показаться, что return result.append(item) что-то возвращает, но функция append в Python ничего не возвращает (возвращает None). Следовательно, все, что helper делает, это обновляет параметр аргумента, пока он не достигнет базового варианта.

Вызов self.helper(item, left, right, result) в функции generateParenthesis приведет к изменению содержимого result в соответствии с операциями, определенными в helper. generateParenthesis затем просто возвращает измененное result.

Ваш измененный код не работает, так как helper не возвращает ничего, как это определено (если быть более техническим, он хвостовой рекурсивный, а не просто рекурсивный). Следовательно, измененный код не будет работать, так как вызов self.helper просто вернет None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...