Обращение целого числа с помощью рекурсии в Python - PullRequest
0 голосов
/ 03 мая 2020

Во время практики рекурсии я натолкнулся на вопрос об обращении целого числа с помощью рекурсии. Я пытался выполнить вопрос, не преобразовывая целое число в строку.

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

def reverseNumber(n):
    if (n//10) == 0:
        return n
    lastDigit = n%10
    ans = reverseNumber(n//10)
    nod = 0
    for i in str(ans):
        nod += 1
    return (10**nod)*lastDigit + ans

При проверке я увидел, что это происходит, потому что, когда lastDigit равно 0, он возвращает только реверсированное целое число из рекурсивного вызова, т.е. вход 4230 даст 324 .

Но это также означало, что все нули между исходным вводом также будут удалены, когда мы углубимся в рекурсивные вызовы.

Поэтому, пожалуйста, скажите мне, как изменить этот код так, чтобы нули в исходный ввод не удаляется при движении задним ходом.

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

reverseNumber должен возвращать int и принимать положительные и отрицательные числа.

Самый простой способ исправить код без обработки отрицательных чисел:

def reverseNumber(n):
    if n == 0:
        return 0
    lastDigit = n%10
    n //= 10
    return int(str(lastDigit) + str(reverseNumber(n))) if n else lastDigit

for test in (0, 123, 120):
    print(test, reverseNumber(test))

Печать :

0 0
123 321
120 21

Да! Обратное значение 120 равно 21, когда вы имеете дело с int типами, а не с str типами.

Другая реализация, которая обрабатывает отрицательные числа, использует совершенно другой подход:

У меня есть разбить это на две функции. Функция rev является функцией генератора, которая предполагает, что она вызывается с положительным, неотрицательным числом и будет рекурсивно выдавать последовательные цифры числа в обратном порядке. reverseNumber объединит эти числа, преобразует в int, откорректирует знак и вернет окончательный результат.

def reverseNumber(n):

    def rev(n):
        assert n >= 0
        yield str(n % 10)
        n //= 10
        if n != 0:
            yield from rev(n)

    if n == 0: return 0 # special case
    x = int(''.join(rev(abs(n))))
    return x if n >= 0 else -x

tests = [0, 132, -132, 120]
for test in tests:
    print(test, reverseNumber(test))

Печать:

0 0
132 231
-132 -231
120 21
0 голосов
/ 03 мая 2020

Для всех неотрицательных n, когда n < 10 это один ди git и уже такой же, как его обратное -

def reverse(n = 0):
  if n < 10:
    return str(n)
  else
    return str(n%10) + rev(n//10)
0 голосов
/ 03 мая 2020

Вам, вероятно, нужно только это:

def rev(n):
    if n>0:
        return str(n%10)+rev(n//10)
    else:
        return ''
...