使用递归的Python反向整数

问题描述 投票:1回答:12

我正在研究一个问题,需要在不使用列表或字符串的情况下反转整数输入。但我的程序只返回第一个和最后一个数字。

def reverseDisplay(number):
   if number<10:
      return number 
   else:
      return reverseDisplay(number//10)
def main():
    number=int(input("Enter a number:"))
    print(number%10,end='')
    print(reverseDisplay(number))
main()

似乎反向功能只运行一次。

python recursion reverse
12个回答
8
投票

这应该工作:

from math import log10
def rev(num):
    if num < 10:
        return num
    else:
        ones = num % 10
        rest = num // 10
        #print ones, rest, int(log10(rest) + 1), ones * 10 ** int(log10(rest) + 1)
        return ones * 10 ** int(log10(rest) + 1) + rev(rest)
print rev(9000), rev(1234), rev(1234567890123456789)

您还可以使用嵌套递归函数减少调用log10的次数和数学运算次数:

def rev(num):
    def rec(num, tens):
        if num < 10:
            return num        
        else:
            return num % 10 * tens + rec(num // 10, tens // 10)
    return rec(num, 10 ** int(log10(num)))

0
投票
def reverse_num_RECUR(num):

    if num<10:
        return num
    else:
        # print(str(num%10))
        return  (str(num%10)+str(reverse_num_RECUR(num//10)))

print('see Reverse ',reverse_num_RECUR(410010699900012066))

-1
投票
def reverseDisplay(variable):


        if variable // 10  == 0  : #base case
                print (variable, end='')
                return
        else:
                first = variable % 10
                every_dig_after = variable // 10 
                return reverseDisplay (variable % 10 )   ,  reverseDisplay(every_dig_after) 




def main():
        number = int (input ( "Enterr a number:"))
        reverseDisplay(number)

main()

-2
投票
def reverseDisplay(number):
   if number<10:
      return number 
   else:
      return reverseDisplay(number//10) + number # you forgot add me

1
投票

它正在运行多次,但它只返回最左边的数字。很容易看出情况,如果你考虑在什么情况下if将是真的。

要使其工作,您需要添加在传递递归时跳过的数字。以下工作只需简单地处理前一个结果左侧的传递数字即可。我宁愿在没有字符串转换的情况下这样做,但我无法想出一个优雅的方法来做到这一点......

def reverseDisplay(number):
   if number<10:
      return number 
   else:
      return int(str(number%10) + str(reverseDisplay(number//10)))
def main():
    number=int(input("Enter a number:"))
    print(number%10,end='')
    print(reverseDisplay(number))
main()

0
投票
def reverseDisplay(number):
    if number<10:     
        return number                      #1 
    first_digit = number % 10              #2
    the_rest = reverseDisplay(number//10)
    ex = 0
    while 1:                               #3
        ex = ex + 1
        if number//(pow(10,ex)) == 0:
            break
    ex = ex - 1
    return first_digit*pow(10,ex) + the_rest #4

这是它的工作方式......(我在这里标注了我所指的线条)

  • 第1行:退出条件。但你知道这一点
  • 第2行:得到最后一位数。 %表示找到除法的余数
  • 第3行:如果我们传入123.此时我们有first_digit = 3和the_rest = 21。我们希望结果是321 = 300 + 21.所以我们需要的是知道我们需要多少次first_digit为10才能工作
  • 第4行:mmm好吃

0
投票

你可以通过保持一个额外的计数来记录已经处理了多少位数。

这可以使用包装函数完成:

def reverseRecursion(number, i):
    if number < 10:
        return number 
    else:
        return reverseRecursion(number//10, i+1) + (number % 10)*(10**i)

def reverseDisplay(number):
    return reverseRecursion(number, 1)

def main():
    number = 1234
    print(reverseDisplay(number))

main()

我们的想法是使用计数器来跟踪要添加到当前数字的尾随零的数量,以使添加工作。

追踪这个将是:

number = 1234

ans(123) + 40
ans(12) + 300 + 40
ans(1) + 2000 + 300 + 40
1 + 2000 + 300 + 40
=> 2341

0
投票

在假设下,递归不是一个要求(如果可能的话,通过迭代替换它总是一个好主意),我建议下面的代码。为了清晰起见,我更改了函数名称,并且还避免了在其他建议中过多的取幂和对数运算。

def reverseNumber(n):
   assert isinstance(n, int) and n >= 0
   base = 10
   result = 0
   while n != 0:
      n, remainder = divmod(n, base)
      result = result*base + remainder
   return result

0
投票

编辑:这是一个有效的解决方案。

def rev(x, prod=0):
    if x < 10:
        return prod + x
    else:
        prod = prod * 10 + x%10 * 10
        return rev(x / 10, prod)

结果:

>>> rev(123)
321
>>> rev(12345)
54321
>>> rev(72823780029)
92008732827L
>>> rev(1)
1

0
投票
def inverte_digitos(n):
        def inverte_aux(n, n_novo):
                if n == 0:
                        return n_novo
                else:
                        return inverte_aux(n//10, n_novo*10+n%10)
        return inverte_aux(n, 0)

这就是我做的


0
投票
def reverseDisplay(number,k):
    if number >0:
        i=(k)*10+number%10
        j = number//10
        return reverseDisplay(j,i)
    else:
        return k

def main():
    number = 1234567
    print(reverseDisplay(number,0))

main()

0
投票

这应该工作:在Python3上检查

# reverse a number
def reverseNum(n, rem=0):
   if n == 0:
      return (rem)//10
   else:
      return reverseNum(n//10, (rem+(n%10))*10)

print(reverseNum(7165))
print(reverseNum(123456789))

小修改版:

def reverseNum(n, rem=0):
    if n == 0:
        return rem
    elif n<10:
        return reverseNum(n//10, (rem+(n%10)))
    else:
        return reverseNum(n//10, (rem+(n%10))*10)

print(reverseNum(7165))
print(reverseNum(123456789))
© www.soinside.com 2019 - 2024. All rights reserved.