在Python中使用多个递归函数

2024-09-24 00:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我递归地计算一个数字的位数之和,直到总和小于10。比如,

99999->45->9

因为最后的数字和是9,所以我们停止。据我所知,我知道以下递归方法效果良好

第一种方法

def sumdigits(n):
    if n//10==0:
       return n
    q,r=divmod(n,10)
    return sumdigits(q+r)

但是我试图用两个递归函数来编写它,以便学习一种不同的方法。这是我的第二种方法

第二种方法

def digitalRoot(n):
    def sumdigits(n):
        if n==0:
            return 0
        q,r=divmod(n,10)
        return r+sumdigits(q)
    s=sumdigits(n)
    if s//10==0:
       return s
    q,r=divmod(s,10)
    return r+sumdigits(q)

如图所示,我正在尝试编写一个单独的检查数字总和是否小于10。它适用于计算级别最多为2的情况。 例如n=99999给出的和为99999->45->9

但是如果我们有像n=27640这样的例子,正确的输出应该是1,因为27640->19->10->1.但是我的代码在第二级停止,并且给出的答案是10.我可以得到一些帮助来修改我的第二个代码以解决这个问题吗?提前谢谢


Tags: 方法代码returnifdef情况数字级别
3条回答

您可以使用sum()和map()从数字的字符串版本中获取数字之和

然后递归只需检查结果是否小于10:

def numerologic(n):
    s = sum(map(int,str(n)))
    return s if s<10 else numerologic(s)

或者在一行上:

def numerologic(n): return n if n<10 else numerologic(sum(map(int,str(n))))

问题是,您最多只能在两个级别上进行计算。在任何情况下,你都没有对逻辑进行编码,即“在我们得到少于10个答案之前一直这样做。”所以……让我们这样做吧

def sum_digits(n):
  t = 0
  while n:
    n, r = divmod(n, 10)
    t += r
  return t

def digital_root(n):
  while n >= 10:
    n = sum_digits(n)
  return n

Hans已经提供了一个迭代解决方案,可以满足您的需求,这里是一个递归方法

你做得很对,但正如汉斯指出的那样,“你从来没有对逻辑进行编码,这样做直到我们得到的答案少于10。”。只是将该条件添加到代码已经执行的操作中

def sum_digits(num):
    '''
    Returns the sum of individual digits in a number
    eg: 123 -> 1+2+3 -> 6
    '''
    if num<10:
        return num
    q,r=divmod(num,10)
    return r+sum_digits(q)

def sum_till_single_digit(num):
    '''
    Does `sum_digits` recursively till the sum is a single digit
    eg: 99 -> 9+9 -> 18 -> 1+8 -> 9
    '''
    if num<10:
        return num
    return sum_till_single_digit(sum_digits(num))

print(sum_till_single_digit(27640)) # 1

相关问题 更多 >