我正在研究一个需要在不使用列表或字符串的情况下反转整数输入的问题。 但是我的程序只返回第一个和最后一个数字。
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()
似乎反向功能只运行一次。
答案 0 :(得分: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)))
答案 1 :(得分: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()
答案 2 :(得分: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
以下是它的工作方式......(我在这里标注了我所指的线条)
答案 3 :(得分: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
答案 4 :(得分: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
答案 5 :(得分: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
答案 6 :(得分: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)
这就是我做的事情
答案 7 :(得分:0)
AVPlayer
答案 8 :(得分: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))
答案 9 :(得分: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))
答案 10 :(得分:-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()
答案 11 :(得分:-1)
#Recursive function body
def reverse(n, s):
if n > 0:
s = s*10 + n%10
reverse(n//10, s)
else:
print(s)
#Block of the main program
n = int(input("Enter number"))
d = reverse(n, 0)
答案 12 :(得分:-2)
def reverseDisplay(number):
if number<10:
return number
else:
return reverseDisplay(number//10) + number # you forgot add me