切片整数的任何替代?

时间:2014-04-24 23:07:39

标签: python python-3.x

我正在尝试创建一个递归函数,该函数会添加最后两个数字,直到没有任何数字为止。例如:

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

9 个答案:

答案 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会返回01,而不是210,就像您预期的那样。因此错误的输出。

简单解决方案:

>>> 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

如果你并不意味着要递归地调用它,那么就不要这样做,即停止检查长度并返回总和。