假设我有一个string ='123',但我想在不使用int()函数的情况下将其转换为123。我将如何使用递归继续这样做? 我到目前为止的想法是将字符串放入一个数组['1','2','3'],然后根据ASCII表示转换它们。
表示字符串中的i:
myArr.append(ord(i) - ord('0'))
所以现在我的列表看起来像[1,2,3]。接下来我应该怎么做才能获得123? 我有一个使用地点值并将它们加在一起的想法(即100 + 20 + 3 = 123),但我不知道如何做到这一点。任何想法都会有所帮助!
答案 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文档鼓励您使用它,所以请不要担心。