Python 使用递归替换goto
我有一个简单的数字根计算(即,将所有数字相加成一个整数,如果总数超过一位数,则重复此过程,直到得到一个位数的答案) 我的第一个冲动是简单地计算初始字符串中的数字之和,测试结果是否超过一个数字,如果是,转到求和套件的开头: 例如Python 使用递归替换goto,python,recursion,goto,Python,Recursion,Goto,我有一个简单的数字根计算(即,将所有数字相加成一个整数,如果总数超过一位数,则重复此过程,直到得到一个位数的答案) 我的第一个冲动是简单地计算初始字符串中的数字之和,测试结果是否超过一个数字,如果是,转到求和套件的开头: 例如 line=“123456789” 数字总和=0 #标签:如果我可以使用goto,它会转到这里! n_chars=len(行) 当n_字符>0时: 求和位数=求和位数+整数(第[0]行) 行=行[1:] n_字符-=1 行=str(和位) 如果len(line)>>地沟根(
line=“123456789”
数字总和=0
#标签:如果我可以使用goto,它会转到这里!
n_chars=len(行)
当n_字符>0时:
求和位数=求和位数+整数(第[0]行)
行=行[1:]
n_字符-=1
行=str(和位)
如果len(line)<2:#全部完成
打印(“数字根为”,和为数字);
其他:
转到标签:#需要重复,直到得到一位数的根编号
但是,当然,python不支持“goto”——所以我想应该将其编写为递归函数?最整洁的编码方式是什么
另外,我正试图让代码非常简单易懂/解释,因为我正在和我的儿子一起做编码练习,他正在学习编程尝试一个主循环
编辑:很抱歉,忘记重置总和数字
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);
>>>地沟根(“12345”)
数字根是:6
>>>地沟根(“8753”)
数字根是:5
>>>地沟根(“6743”)
数字根是:2
好了。我需要仔细阅读。您可以尝试以下代码:
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检查和异常,但这会使代码复杂化,应该是以后的步骤。使用递归和列表理解:
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")
要替换“转到”,思想是在每次迭代找到其总和后跟踪该行的内容 因此,如果我理解你的问题,以下方法应该有效:
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
我可否提出以下建议:
>>> 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
或者你可以
如果总和>10,则会错过再次执行此操作,但当得到的答案超过一位数时,不会重复。对此表示抱歉,我没有仔细阅读。我把它编辑成正确的,除非你想使用过去9的剩余部分,但这并不难改变。8753“>“23”>“5”应该是答案。这是…很抱歉。顺便说一下,这使用了python的两个概念:1)字符串是一个字符列表2)列表理解虽然在第一次求和得到“45”后会迭代,但不会得到正确的答案(“9”),因为在迭代之前不会重置sum_digits值,所以你只需要在一个两位数上增加更多的位数,然后满足退出条件(即无止境循环)?这将导致一个无限循环。它将行设置为字符串强制求和,然后重复循环,因为
行
总是大于长度1。对不起,关于inf循环,第一次没有真正运行代码:3非常好。现在我只需要想办法向13岁的溜溜球解释一下。我可能需要将“t=sum([int(d)表示n中的d])行扩展为更明显的内容,然后将其显示为最终的、更紧凑的版本但是“123456789”的数字根应该是“9”而不是“0”@user2147243,你是对的。这可以通过在模之前减去1,然后在模之后加上来实现。但是对于0
,它失败了。我喜欢这个答案,因为它很容易向我儿子解释它是如何工作的。我甚至没有意识到尼玛的答案是错的。我错了,它实际上是一样的
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
>>> 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
def find_root(s):
return (int(s) - 1) % 9 + 1
>>> find_root("12345")
6
>>> find_root("8753")
5
>>> find_root("6743")
2