簡體   English   中英

在 Python 中使用遞歸反轉 integer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM