Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用递归替换goto_Python_Recursion_Goto - Fatal编程技术网

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