Collat​​z 功能未正确退出

Collatz function not exiting correctly

这是一个程序,旨在递归地计算 Collat​​z 序列的长度:

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。程序按预期运行:使用 even_collatz 和数字 10.

调用 collatz_counter

下一步的预期操作是 运行 collatz_counterinitialNumber 为 1,initialLength 为 10。我期望会发生什么是第一个 if 语句的计算结果为真,collatz_counter 应该 return length 然后退出。然而,这不是发生的事情:

实际发生的是函数对第一个if语句求值,运行是return length行,然后跳转到if initialNumber % 2...下的代码行和整个过程在无限循环中一遍又一遍地重复自己。

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

我觉得像是打字错误。您定义了一个需要两个数字的函数 collatz_counter

但是你这样称呼它:

...
print(collatz_counter(13), 1)

只需尝试将最后一行更改为:

print(collatz_counter(13, 1))

而且应该没问题。

希望对您有所帮助!

您以一种有点奇怪的方式混合了递归和循环。问题是while True:。因为你从不 return 循环内的任何东西,所以没有什么能阻止它永远继续下去。您的代码达到 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:循环,再加上缺少returns.

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。