2014-03-29 62 views
2

說我有一個字符串='123',但我想不使用int()函數將其轉換爲123。我將如何去做這個使用遞歸? 我到目前爲止的想法是將字符串放入數組中['1','2','3'],然後根據ASCII表示將它們轉換。Python - 使用遞歸進行整數的數字字符串?

爲我在串:

myArr.append(ORD(I) - ORD( '0'))

所以現在我有一個列表尋找像[1,2,3]一樣。我應該怎麼做遞歸獲得123? 我有一個想法,使用地點值並將它們添加在一起(即100 + 20 + 3 = 123),但我不知道如何做到這一點。任何想法都會有所幫助!

回答

2

我想這是一個學術性的練習,因爲這是一個相當有意思的問題。以下是如何,假設s表示大於或等於零的整數:

def strToInt(s, acc): 
    if not s: 
     return acc 
    return strToInt(s[1:], 10 * acc + ord(s[0]) - 48) 

或者更短:

def strToInt(s, acc): 
    return strToInt(s[1:], 10 * acc + ord(s[0]) - 48) if s else acc 

關鍵是要積累的轉換結果在一個額外的參數,這具有產生一個尾遞歸解決方案的好的副作用(在Python中並不重要,但仍然...)。另外請注意,我們如何使用ord()來獲取表示數字的字符的數值,並且通過簡單地減去48我們得到實際的數字值。測試它,它按預期工作:

strToInt('123', 0) # the accumulator always starts in zero 
=> 123 
+0

給我練遞歸的鍛鍊!當我可以使用int()時,我認爲這是一個荒謬的練習,但我認爲這是一個很好的練習來真正理解遞歸 – user3128178

+0

可笑的部分不是你可以使用int,而是可以用for來解決它。循環。 – Selcuk

1

這不會是遞歸的(我不認爲你明白這意味着什麼),但:

for char in string: 
    array.append(ord(char) - ord('0')) 

array.reverse() 

num = 0 
for index, val in enumerate(array): 
     num += val * (10 ** index) 

編輯:啊,我看這是進行練習。是的,通過遞歸來解決這個問題是一個荒謬的問題,但其他解決方案之一就是這樣做的。

1

另一種可能性:

def strToInt(s): 
    if s: 
    return (ord(s[-1]) - ord('0')) + 10 * strToInt(s[:-1]) 
    else: 
    return 0 
+0

遞歸調用應該是'strToInt' –

+0

@ÓscarLópez,謝謝。 – ooga