在程序中得到错误的总和,通过在Python 2.7中递归添加数字将数字压缩为一个数字

时间:2017-10-07 06:27:23

标签: python recursion

当我将输入设为12345678时,为什么我将总和设为8而不是9?

这是我的代码:

def single_digit(a):
    n=a
    sum=0
    while(n>0):
          r=n%10
          sum+=r
          n=n/10
          while sum>10:
               single_digit(a)
    return sum
a=input("\nEnter a number : ")
val=single_digit(a)
print"The number  condensed to a single digit = ",val

3 个答案:

答案 0 :(得分:1)

这会导致无限循环。 sum的值在执行内部while循环期间永远不会改变,因此while sum > 10:循环永远不会终止,因为一旦总和超过10,您就不会修改它。换句话说,一旦sum越过10,控件就无法退出循环。

我会按如下方式编写函数

def single_digit(a):

    # Already in the simplest form. Nothing to do
    if a < 10:
        return a

    num = a
    sum_of_digits = 0

    # Compute sum of digits of the number
    while num > 0:
        remainder = num % 10
        sum_of_digits += remainder
        num = num // 10

    # Further condese the output to bring it to simple form i.e. single digit
    if sum_of_digits > 10:
        return single_digit(sum_of_digits)
    else:
        return sum_of_digits

在我看来,编写相同代码的另一种简洁明了的方法是

def single_digit(a):
    sum_of_digits = sum(int(digit) for digit in str(a))
    if sum_of_digits < 10:
        return sum_of_digits
    else:
        return single_digit(sum_of_digits)

答案 1 :(得分:0)

while sum>10:
   single_digit(a)

您正在计算a的数字总和,然后检查总和是否为单个数字,如果不是,则您再次计算原始数字a的数字总和,你应该计算新的总和。

while sum>10:
   sum = single_digit(sum)

另外,如果你想要递归,请完全递归:

def single_digit(a):
    # now it also works for negative numbers too
    if -10 < a < 10:  
        return a

    n=a
    sum=0
    while(n>0):
          r=n%10
          sum+=r
          n= n/10

    return single_digit(sum)

# a=input("\nEnter a number : ")
a = 12345678
val=single_digit(a)
print("The number  condensed to a single digit = ",val)

答案 2 :(得分:0)

命名变量并不容易,但使用描述性名称可以简化生活:)

y

打印9