我有一个简单的数字根计算(即,对一个整数中的所有数字求和,如果总数超过一位数,请重复该过程直到最终得到一位数的答案)。
我的第一个冲动是简单地计算初始字符串中数字的总和,测试结果是否超过一位数,如果是,则转到求和套件的开头:
例如。
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。我正在尝试保持代码非常简单易于理解/解释,因为我正在与我的儿子进行编码练习,他正在学习编程
答案 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_digitline = "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")
答案 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