[英]Reversing an integer using recursion in Python
在練習遞歸時,我遇到了一個使用遞歸來反轉 integer 的問題。 我試圖在不將 integer 轉換為字符串的情況下做這個問題。
我能夠部分解決這個問題,但 output 總是沒有原始輸入中的任何零。 下面是我想出的代碼:
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 時,它僅從遞歸調用返回反轉的 integer,即輸入 4230 將給出 324。
但這也意味着隨着我們深入遞歸調用,原始輸入之間的所有零也將被刪除。
所以請告訴我如何修改此代碼,以便在反轉時不會刪除原始輸入中的零。
你可能只需要這個:
def rev(n):
if n>0:
return str(n%10)+rev(n//10)
else:
return ''
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。
另一種處理負數的實現采用了完全不同的方法:
我把它分成兩個功能。 Function rev
是一個生成器 function,它假設它被一個正數、非負數調用,並且將遞歸地產生反向的連續數字。 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
對於所有非負數n
,當n < 10
時,它是單個數字並且已經與其反向相同 -
def reverse(n = 0):
if n < 10:
return str(n)
else
return str(n%10) + rev(n//10)
你也可以試試下面的 Python3 代碼。 它將涵蓋要反轉為整數的正整數和負整數 - 而不是字符串......
x = int(input("What integer shall be reversed? "))
n = abs(x) # ... to handle negative integers
r = 0 # ... will hold the reversed int.
while n > 0: # Recursion part reversing int.
r = (r * 10) + (n % 10) # using '%' modulo
n = int(n / 10) # and a 'dirty way' to floor
if x < 0: # Turn result neg. if x was neg.
return (r * -1)
else:
return r # Keep result pos. if x was pos.
這種方法將使您的零在 integer 的中間保持不變,盡管它會使初始數字末尾的任何零消失 - 正確地使整數不以零開頭。 ;))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.