Python - 使用递归整数的数字字符串?

时间:2014-03-29 17:57:06

标签: python recursion

假设我有一个string ='123',但我想在不使用int()函数的情况下将其转换为123。我将如何使用递归继续这样做? 我到目前为止的想法是将字符串放入一个数组['1','2','3'],然后根据ASCII表示转换它们。

  

表示字符串中的i:

     
    

myArr.append(ord(i) - ord('0'))

  

所以现在我的列表看起来像[1,2,3]。接下来我应该怎么做才能获得123? 我有一个使用地点值并将它们加在一起的想法(即100 + 20 + 3 = 123),但我不知道如何做到这一点。任何想法都会有所帮助!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)
编辑:啊,我觉得这是一个练习。是的,通过递归来解决这个问题是一个荒谬的问题,但其他答案之一就是它。

答案 2 :(得分:1)

另一种可能性:

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

答案 3 :(得分:0)

首先想到的是着名的C方法atoi()。 Python有一个类似的方法,also called atoi(),但它已被弃用,使用int()指令。

因此,尽管您的评论,我建议使用int()。 Python文档鼓励您使用它,所以请不要担心。

int() documentation for Python 2.7

int() documentation for Python 3.3