在Python中使用递归反转整数

2024-05-21 15:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在练习递归时,我遇到了一个使用递归反转整数的问题。我试图在不将整数转换为字符串的情况下回答这个问题

我能够部分地解决这个问题,但是输出总是没有来自原始输入的任何零。下面是我想出的代码:

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

但这也意味着,随着递归调用的深入,原始输入之间的所有零也将被删除

因此,请告诉我如何修改此代码,以便在反转时不删除原始输入中的零


Tags: 字符串代码inforreturnifdef情况
3条回答

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

对!!当处理int类型而不是str类型时,120的反方向是21

另一个处理负数的实现采用了完全不同的方法:

我已经将其分解为两个函数。函数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

您可能只需要这样:

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

对于所有非负n,当n < 10是一个单位数时,它已经与其反向相同-

def reverse(n = 0):
  if n < 10:
    return str(n)
  else
    return str(n%10) + rev(n//10)

相关问题 更多 >