我正在尝试创建一个递归函数,该函数会添加最后两个数字,直到没有任何数字为止。例如:
sumDigits(239)
等同于:
2+3+9=14
这很困难,因为输入必须是整数,如果不转换它就不能切片。我决定尝试把它变成一个列表,因为我认为pop()方法对此很有用。似乎这种方法不起作用。有什么建议吗?
EXECUTION:
>>> sumDigits('234')
9
>>> sumDigits('2343436432424')
8
>>>
CODE:
def sumDigits(n):
l1 = list(str(n))
if len(l1) > 1:
a = int(l1.pop())
b = int(l1.pop())
l1.append(str(a+b))
return sumDigits(int(''.join(l1)))
else:
return n
答案 0 :(得分:1)
不应传递字符串,而应传递整数列表:
def sumDigits(l1):
if len(l1) > 1:
a = l1.pop()
b = l1.pop()
l1.append(a+b)
return sumDigits(l1)
else:
return l1[0]
print sumDigits([2,3, 4])
print sumDigits([2, 3, 4, 3, 4, 3, 6, 4, 3, 2, 4, 2, 4])
您的方法存在的问题是:
'23434364324|24|'
- > '2343436432|46|'
- > '2343436432 | 10'
,
现在,pop会返回0
和1
,而不是2
和10
,就像您预期的那样。因此错误的输出。
简单解决方案:
>>> s = '2343436432424'
>>> sum(int(x) for x in s)
44
答案 1 :(得分:1)
使用像reduce()
这样的功能工具可以解决问题
from functools import reduce
def sumDigits(n):
return reduce((lambda x, y: int(x) + int(y)), list(str(n)))
答案 2 :(得分:1)
修改强>
简单的解决方案是:
def sumDigits(n):
return sum(int(i) for i in str(n))
在您回答我的评论后,以下解决方案不适用。
def sumDigits(n):
n = [int(i) for i in str(n)]
return sumDigitsRec(n)
def sumDigitsRec(li):
if len(li) > 1:
li[-1] += li.pop()
return sumDigits(''.join(str(i) for i in li))
else:
return li[0]
答案 3 :(得分:1)
由于每个人似乎都打算为你解决你的功课,这里是优雅的递归解决方案。
def sumDigits(n):
if n < 10:
return n
return n % 10 + sumDigits(n / 10)
答案 4 :(得分:0)
作为字符串:
def sumDigits(n):
answer = 0
for num in n:
answer += int(num)
return answer
不使用切片,仅使用整数输入:
def sumDigits(n):
answer = 0
while n:
answer += n%10
n /= 10
return answer
答案 5 :(得分:0)
如果我正确理解您的问题,您希望在总和为2位数字时停止对数字求和。我认为您的计划中的错误是您需要if len(l1) > 2:
而不是if len(l1) > 1:
,以确保在您只有2位数时不会递归。
答案 6 :(得分:0)
你可以用这种方式递归地做到:
def sumDigits(n,s=0):
if len(n) == 0:
return s
else:
return sumDigits(n[:-1],s+int(n[-1]))
如果你想要更简单和pytonic方式(不是递归),你可以这样做
>>> s = 2343436432424
>>> sum(map(int,str(s)))
44
答案 7 :(得分:0)
所提供的所有解决方案均未达到问题描述中所述的先决条件。这是正确的答案:
使用** kwargs和exception来在递归函数中使用保持变量。
例如:
def recursionFunc(x, **kwargs):
try:
count = kwargs['count']
except:
count = 0
#Code down here to add num from x to count
#remove last index on every iteration from x
#etc
return recursionFunc(x, count = count)
答案 8 :(得分:-3)
它正常工作,如下面的检查所示:
>>> 2343436432424 % 9
8
如果你并不意味着要递归地调用它,那么就不要这样做,即停止检查长度并返回总和。