Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 Collatz功能未正确退出_Python_Function_Recursion_Collatz - Fatal编程技术网

Python Collatz功能未正确退出

Python Collatz功能未正确退出,python,function,recursion,collatz,Python,Function,Recursion,Collatz,下面是一个用于递归计算Collatz序列长度的程序: def odd_collatz ( n ): return (3 * n) + 1 def even_collatz ( n ): return int(n / 2) def collatz_counter ( initialNumber, initialLength ): length = initialLength while True: if initialNumber == 1:

下面是一个用于递归计算Collatz序列长度的程序:

def odd_collatz ( n ):
    return (3 * n) + 1

def even_collatz ( n ):
    return int(n / 2)

def collatz_counter ( initialNumber, initialLength ):
    length = initialLength

    while True:
        if initialNumber == 1:
            return length

        elif initialNumber != 1:
            length += 1

            if initialNumber % 2 == 0:
                 collatz_counter(even_collatz(initialNumber), length)

            else:
                collatz_counter(odd_collatz(initialNumber), length)

print(collatz_counter(13, 1)
预期答案应该是10。然而,程序陷入了无限循环。在序列的倒数第二步
initalNumber
等于2。程序按预期运行:
collatz\u计数器
使用
偶数collatz
和数字10调用

下一步的预期操作是运行
collatz_计数器
initialNumber
为1,
initialLength
为10。我希望第一个if语句的计算结果为true,
collatz_计数器
应该返回
length
,然后退出。然而,情况并非如此:

实际情况是,函数计算第一条if语句,运行
返回长度
行,然后跳转到
if initialNumber%2…
下的代码行,整个过程在无限循环中一次又一次地重复


关于为什么会发生这种情况有什么想法吗?

在我看来像是打字错误。定义一个函数
collatz\u counter
需要两个数字

但你这样称呼它:

...
print(collatz_counter(13), 1)
只需尝试将最后一行更改为:

print(collatz_counter(13, 1))
应该没问题


希望这有帮助

您以一种有点奇怪的方式混合了递归和循环。问题是
,而True:
。因为你永远不会从循环中返回任何东西,所以没有什么可以阻止它永远继续下去。您的代码达到1,然后继续增加长度。这是一个固定版本

def odd_collatz ( n ):
    return (3 * n) + 1

def even_collatz ( n ):
    return int(n / 2)

def collatz_counter ( initialNumber, initialLength ):
    length = initialLength


    if initialNumber == 1:
        return length

    elif initialNumber != 1:
        length += 1

        if initialNumber % 2 == 0:
            return collatz_counter(even_collatz(initialNumber), length)

        else:
            return collatz_counter(odd_collatz(initialNumber), length)

print(collatz_counter(13, 1))

主要错误是
while True:
循环,以及缺少的返回

def odd_collatz ( n ):
    return (3 * n) + 1

def even_collatz ( n ):
    return int(n / 2)

def collatz_counter(initialNumber, length):
    if initialNumber == 1:
        return length
    elif initialNumber != 1:
        length += 1
        if initialNumber % 2 == 0:
             return collatz_counter(even_collatz(initialNumber), length)
        else:
            return collatz_counter(odd_collatz(initialNumber), length)

print(collatz_counter(13, 1))

打印10。

如果初始数字不是1,则elif和else子句不会返回任何内容。您还调用了自身内部的函数:
collatz\u counter
请修复代码。在
collatz\u counter()
的最后几行中,似乎缺少一些右括号。另外,正如@Andrew所暗示的,这些行应该是
return
collatz\u counter(…)
我已经编辑过了。它们只是SE中的拼写错误,在实际代码中它们是正确的。linusG给了我一个提示,我把它们修好了。Andrew,这就是为什么我不能找出问题所在,它在评估不应该评估的东西。现在它的另一个打字错误是:应该是
print(collatz_counter(13,1))
,你错过了一个右括号。为了弥补这个问题,如果
length
默认为0,它会在函数自身扫描之前增加到1,函数将返回,因为长度现在是1。当我在这里输入它时,这是一个输入错误。在程序中,它是正确编写的。谢谢你提醒我!我在解决它的手术室里改变了它!我学到了一些关于如何正确执行递归的知识。谢谢