Может ли кто-нибудь помочь мне преобразовать эту функцию в рекурсивную? - PullRequest
0 голосов
/ 02 апреля 2019

Этот код принимает строку букв, цифр, символов, (почти все) вытаскивает числа, объединяет их в строку и выводит список чисел.Я ищу способ сделать эту функцию рекурсивной вместо этого.

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

def getdigits(entered):
    print(entered, "maps to")
    nums = ""
    for x in range (0, len(entered)):
        for i in range (0,9):
            if entered[x] == str(i):
                nums += entered[x]
    print(nums)

entered = ("1.234.123[123]")
getdigits(entered)
entered = ("**1.23a-42")
getdigits(entered)

ожидаемые результаты для вышеприведенных примеров:

1234123123
12342

соответственно

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

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

В вашем случае хорошим условием остановки является «пустая строка».Вырежьте символы, которые вы обработали, и рекурсивно называйте себя с помощью getdigits(entered[1:])

Не забудьте удалить цикл, который вы хотели заменить на рекурсию.

В качестве ментальной модели подумайте оэто как способ обработки предметов.Вы можете обрабатывать элементы, помещая их в строку и проходя мимо них (цикл / итерация) или помещая их в стек и выбирая первый сверху, пока стек не станет пустым (рекурсия).

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

Простой способ решить эту проблему - инициализировать переменную пустой строкой (nums = ""):

def getdigits(entered, nums = ""):
    if entered:
        if entered[0] in "0123456789":
            nums += entered[0]
        entered = entered[1:]
        # recursive  
        getdigits(entered, nums)
    else:
        # entered is empty string
        print(nums)

entered = ("1.234.123[123]")
getdigits(entered)
entered = ("**1.23a-42")
getdigits(entered)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...