Python - 使用递归将数字字符串转换为整数?

2 投票
4 回答
3432 浏览
提问于 2025-04-18 00:27

假设我有一个字符串 = '123',但我想把它转换成数字123,而不使用int()这个函数。我该如何通过递归来实现呢?

我目前的想法是把这个字符串放进一个数组里,变成这样 ['1','2','3'],然后根据ASCII码来转换它们。

for i in string:

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

这样我就得到了一个看起来像 [1,2,3] 的列表。接下来我该怎么做才能递归地得到123呢?我想到可以利用位数,把它们加起来(比如100 + 20 + 3 = 123),但我不知道该怎么做。有什么想法会很有帮助!

4 个回答

0

首先想到的就是著名的C语言中的atoi()方法。

Python也有一个类似的方法,叫做atoi(),不过这个方法已经被淘汰了,建议大家使用int()。

所以,尽管你有不同的看法,我还是推荐你使用int()。Python的文档也鼓励大家使用这个方法,所以你可以放心使用。

Python 2.7的int()文档

Python 3.3的int()文档

1

还有一种可能性:

def strToInt(s):
  if s:
    return (ord(s[-1]) - ord('0')) + 10 * strToInt(s[:-1])
  else:
    return 0
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

我想这可能是个学术上的练习,因为这个问题有点牵强。假设 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

撰写回答