使用递归替换goto

时间:2014-04-11 02:54:58

标签: python recursion goto

我有一个简单的数字根计算(即,对一个整数中的所有数字求和,如果总数超过一位数,请重复该过程直到最终得到一位数的答案)。

我的第一个冲动是简单地计算初始字符串中数字的总和,测试结果是否超过一位数,如果是,则转到求和套件的开头:

例如。

line = "123456789"
sum_digits = 0    
# label: if I could use goto, it would go to here!
n_chars = len(line)
while n_chars > 0:
    sum_digits = sum_digits + int(line[0])
    line = line[1:]
    n_chars -= 1
line = str(sum_digits)
if len(line) < 2: # all done
    print("digital root is ", sum_digits);
else:
    goto label: # need to repeat until get single digit root number

但是,当然,python不支持'goto' - 所以我想这应该写成递归函数?编码的最佳方法是什么?

PS。我正在尝试保持代码非常简单易于理解/解释,因为我正在与我的儿子进行编码练习,他正在学习编程

7 个答案:

答案 0 :(得分:1)

要替换goto这个想法是为了跟踪每次迭代后的行,你找到它的总和。

所以,如果我理解你的问题,以下内容应该有效:

def find_root(line):
    while len(line) > 1:
         sum_digits = 0
         for num in list(line):
             sum_digits += int(num)
         line = str(sum_digits)
    print line


>>find_root("123456789")
9
>>find_root("93856")
4

答案 1 :(得分:1)

或者您可以"do it the math way"

def find_root(s):
    return (int(s) - 1) % 9 + 1

>>> find_root("12345")
6
>>> find_root("8753")
5
>>> find_root("6743")
2

答案 2 :(得分:0)

尝试主循环

编辑:抱歉,忘了重置sum_digit

line = "123456789"
sum_digits = 0    
# label: if I could use goto, it would go to here!

while len(line) > 1:
   n_chars = len(line)
   while n_chars > 0:
       sum_digits = sum_digits + int(line[0])
       line = line[1:]
       n_chars -= 1
   line = str(sum_digits)
   sum_digits = 0

print("digital root is ", sum_digits);

答案 3 :(得分:0)

def dig_root(line):
    while len(line) > 1:
        total = 0
        for num in line:
            total += int (num)
        line = str(total)
    print "The digital root is: " + str (line)

&GT;&GT;&GT; dig_root( “12345”)

数字根是:6

&GT;&GT;&GT; dig_root( “8753”)

数字根是:5

&GT;&GT;&GT; dig_root( “6743”)

数字根是:2

我们走了。我需要仔细阅读。

答案 4 :(得分:0)

您可以尝试以下代码:

def calc_root(num_string):
    root = 10
    num_string2 = str(num_string)
    while root >= 10:
       root = sum([int(x) for x in num_string2])
       num_string2 = str(root)
    return root

这将减少到没有递归的单位数根。这个想法是,只要计算的根等于或大于10,它就会保持在while循环中。

您可以在num_string2上添加对isdigit的检查和异常,但这会使代码复杂化,应该是后续步骤。

答案 5 :(得分:0)

使用递归和列表理解:

def sumdigits(n):
    if len(n) > 1:
        t=sum([int(d) for d in n])
        return sumdigits(str(t))
    else:
        return n

print sumdigits("123456789")
  1. 将数字作为字符串
  2. 如果字符串的长度超过1,则递归调用函数来计算总和
  3. 否则返还金额

答案 6 :(得分:0)

我可以建议如下:

>>> def digiroot(number_string):
...     while len(number_string) > 1:
...             sum = 0
...             for i in number_string:
...                     sum += int(i)
...             number_string = str(sum)
...     print number_string
... 
>>> digiroot("124")
7
>>> digiroot("12487")
4
>>> digiroot("12487123")
1
>>> digiroot("123456789")
9