Python рекурсивная функция не возвращает случайный выбор - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь получить случайную работу в python с помощью модуля random. Моя функция выглядит следующим образом:

import random

word_file = "/usr/share/dict/words"
WORDS = open(word_file).read().splitlines()


def get_random_word(max_length=None):
    word = random.choice(WORDS)
    print(word)

    if not max_length:
        return word

    if len(word) > max_length:
        get_random_word(max_length)

    return word

Когда я импортирую эту функцию в ipython консоль и запускаю как get_random_word(max_length=5), я получаю такой результат:

Latasha's
Hammond's
evacuated
aviary
misconducted
airfare's
controllable
unduly
gaunt
Out[32]: "Latasha's"

Как видно из На выходе функция вызывает себя, пока не найдет слово длиной менее 5. Но в конце оно возвращает самое первое случайное слово. Что не так с моей функцией?

Ответы [ 5 ]

0 голосов
/ 01 февраля 2020

Рекурсия в Python неэффективна из-за повторяющихся вызовов пользовательских функций и ограничена в том смысле, что в конечном итоге вы переполните стек, если не завершите рекурсию достаточно быстро. Таким образом, хотя решение вашей проблемы тривиально (возвращает возвращаемое значение рекурсивного вызова), это спорный вопрос, поскольку рекурсия - это неправильный подход для начала.

Вместо этого используйте while l oop звоните random.choice, пока не получите слово, соответствующее вашему состоянию.

import random

word_file = "/usr/share/dict/words"
WORDS = open(word_file).read().splitlines()


def get_random_word(max_length=None):
    while True:
        word = random.choice(WORDS)
        if max_length is None or len(word) <= max_length:
            return word
0 голосов
/ 01 февраля 2020

Я думаю, что ваш код работает, вам вообще не нужна эта строка return word, а также вам не нужно вызывать get_random_word внутри печати (если вы это делаете).

0 голосов
/ 01 февраля 2020

В операторе if вам нужно вернуть значение

if len(word) > max_length:
        return get_random_word(max_length)

последнее return word вернет последнее слово в памяти, в этом случае это первый случай рекурсии, если у вас нет совпадений, потому что вы никогда не возвращайся из базового случая.

0 голосов
/ 01 февраля 2020

Это простая ошибка рекурсии. Значение переменной word не сохраняется при рекурсивных вызовах. Вы должны присвоить возвращаемое значение.

word = get_random_word(max_length)
0 голосов
/ 01 февраля 2020

Вы не присваивали возвращаемое значение в своей функции.

        get_random_word(max_length)

    return word

должно быть:

    if len(word) > max_length:
        word = get_random_word(max_length)

    return word
...