Python - 使用递归将数字字符串转换为整数?
假设我有一个字符串 = '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的文档也鼓励大家使用这个方法,所以你可以放心使用。
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