繁体   English   中英

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

[英]Getting wrong sum in program to condense a number to a single digit by adding the digits recursively in Python 2.7

当我将输入设为 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

这将导致无限循环。 sum的值在内部while循环的执行过程中永远不会改变,因此while sum > 10:循环永远不会终止,因为一旦 sum 超过 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)
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)

命名变量并不容易,但使用描述性名称会让生活更轻松:)

def sum_of_digits(num):
    """ Recursively add the digits of a positive integer until the sum
    becomes a single digit. Return the sum. """

    if num < 10:    # base case
        return num

    num_copy = num
    result = 0

    while num_copy > 0:
          remainder = num_copy % 10
          result += remainder
          num_copy //= 10

    return sum_of_digits(result)

print(sum_of_digits(12345678))

它打印 9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM