Рекурсивная функция Python с печатью обратных цифр

1

Недавно я занимаюсь написанием кода для "рекурсивных функций". это, я пытаюсь закодировать одну функцию, называемую обратными цифрами, и я замечаю, что есть много разных способов сделать это. Мой код работает в IDLE, когда я использую return. Например:

def reverse_digits(num):
if num < 10:
    return num
else:
    return str(num%10) + str(reverse_digits(num//10))
print(reverse_digits(1234))

Тем не менее, я хочу напечатать результат в рекурсивной функции, например,

def reverse_digits(num):
if num < 10:
    return num
else:
    print(str(num%10) + str(reverse_digits(num//10)))
reverse_digits(1234)

я бы получил

21
3None
4None

Кто-нибудь может объяснить, почему?

Или помочь мне улучшить код?

  • 1
    Да, когда вы печатаете что-то, что не означает, что функция возвращает это что-то, поэтому, если вы хотите показать шаги, вам нужно как print и return .
Теги:
recursion

1 ответ

2
Лучший ответ

Если вы явно ничего не return, функция в Python вернет None. Во второй реализации вы print результат определенного выражения, но в этой кодировке вы не возвращаете его.

Вы можете исправить это с помощью:

def reverse_digits(num):
    if num < 10:
        return num
    else:
        res = str(num%10) + str(reverse_digits(num//10))
        print(res)
        return res

print(reverse_digits(1234))

Поэтому мы вычисляем его и возвращаем.

Обратите внимание, что, тем не менее, более эффективно оставаться в int домене, вместо того чтобы выполнять все виды обработки строк и, таким образом, реализовать его так:

def reverse_digits(num, rem = 0):
    if not num:
        return rem
    else:
        return reverse_digits(num // 10, 10 * rem + (num % 10))

Учитывая, что вся арифметика может быть выполнена в постоянное время, это приведет к алгоритму O (n), тогда как первый обычно принимает O (n 2).

  • 0
    Большое спасибо, но у меня есть еще одна проблема, которая заключается в том, что она будет печатать три раза с 21, 321 до 4321, как мы можем получить 4321 только один раз, но используя рекурсивную функцию. Я пытаюсь что-то удалить, но это не сработает.
  • 0
    @neilissac: удалите print(..) во внешнем вызове (последняя строка), так как это получит результат, и перепечатайте его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню