Collatz函数未正确退出

2024-10-05 10:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个用于递归计算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_counter使用even_collatz和数字10调用。你知道吗

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

实际情况是,函数计算第一个if语句,运行return length行,然后跳到if initialNumber % 2...下的代码行,整个过程在一个无限循环中一遍又一遍地重复。你知道吗

你知道为什么会这样吗?你知道吗


Tags: 程序returnifdefcounter情况序列语句
3条回答

在我看来像是错别字。定义一个collatz_counter函数,它需要两个数字。你知道吗

但你这样称呼它:

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

试着把最后一行改成:

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。你知道吗

你正在以一种奇怪的方式混合递归和循环。问题是while 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))

相关问题 更多 >

    热门问题