Collat​​z功能无法正确退出

时间:2016-08-20 18:21:03

标签: python function recursion collatz

这是一个旨在递归计算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.程序按预期运行:使用collatz_counter和数字10调用even_collatz

下一步的预期操作是运行collatz_counterinitialNumber为1,initialLength为10.我期望会发生的是第一个if语句将评估为true,collatz_counter应返回length,然后退出。但是,这不会发生什么:

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

关于为什么会发生这种情况的任何想法?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

看起来像是一个错字。您定义了一个期望两个数字的函数collatz_counter

但你这样称呼它:

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

尝试将最后一行更改为:

print(collatz_counter(13, 1))

应该没事。

希望这有帮助!

答案 2 :(得分:0)

主要错误是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。