【问题标题】:Collatz function not exiting correctlyCollat​​z 函数未正确退出
【发布时间】:2016-08-20 18:21:03
【问题描述】:

这是一个用于递归计算 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 语句将评估为 true,@ 987654328@ 应该返回length 然后退出。然而,情况并非如此:

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

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

【问题讨论】:

  • 如果初始数字不是 1,则 elif 和 else 子句不会返回任何内容。你也在内部调用一个函数:collatz_counter
  • 请修正代码。看起来您在collatz_counter() 的最后几行中缺少一些右括号。此外,正如@Andrew 暗示的那样,这些行应该是 return collatz_counter(...)
  • 我已经编辑过了。它们只是 SE 中的拼写错误,在实际代码中它们是正确的。 linusG 给了我一个提示,我修复了它们。安德鲁,这就是为什么我无法弄清楚问题所在,它正在评估不应该评估的东西。
  • 现在是另一个错字:应该是print(collatz_counter(13, 1)),你漏掉了一个右括号。

标签: python function recursion collatz


【解决方案1】:

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

【讨论】:

  • 解决了!我学到了一些关于如何正确进行递归的知识。谢谢
【解决方案2】:

对我来说似乎是一个错字。您定义了一个函数 collatz_counter 需要两个数字。

但你这样称呼它:

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

试着把最后一行改成:

print(collatz_counter(13, 1))

应该没问题的。

希望这会有所帮助!

【讨论】:

  • 为了解决这个问题,如果length 默认为 0,它会在函数 cam 本身之前递增到 1,并且函数将返回,因为长度现在为 1。
  • 我在这里输入的时候打错了。在程序中,它是正确编写的。感谢您的注意!我已经在 OP 中更改了它
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2015-10-02
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多