Python Collat​​z无限循环

时间:2019-03-03 13:11:07

标签: python-3.x infinite-loop

很抱歉,如果有人提出类似的问题,但我找不到任何解决方法。我已经为Python中的Collat​​z序列编写了一段简单的代码,该代码对于偶数似乎很好用,但是当输入奇数时陷入无限循环。

我无法弄清楚为什么会这样,或者无法打破这种循环,因此不胜感激。

print ('Enter a positive integer')
number = (int(input()))

def collatz(number):
    while number !=1:
        if number % 2 == 0:
            number = number/2
            print (number)
            collatz(number)
        elif number % 2 == 1:
            number = 3*number+1
            print (number)
            collatz(number)

collatz(number)

4 个答案:

答案 0 :(得分:0)

您的函数缺少任何return语句,因此默认情况下它返回None。您可能希望定义函数,以便它返回距输入数字1有多少步。您甚至可以选择cache这样的结果。

您似乎想进行递归调用,但是您还使用了while循环。选择一个或另一个。

递归时,您不必重新分配变量,可以选择将表达式放入调用中,如下所示:

    if number % 2 == 0:
        collatz(number / 2)
    elif ...

这给我们带来了问题的症结。在递归过程中,您创建了许多堆栈框架,每个框架都有其自己的名为number的私有变量,并且包含不同的值。通过更改当前堆栈帧中的number 并在进行递归调用时将其复制到下一个级别帧,您将感到困惑。在偶数情况下,这适用于您的终止子句,但在奇数情况下则不行。只需进行while循环而根本不进行递归,您会更好。

您可能会发现http://pythontutor.com/可帮助您了解正在发生的事情。 2的幂的输入将终止,但是您会看到从栈中弹出那些多余的帧花了很长时间。

execution trace

答案 1 :(得分:0)

根据Collat​​z猜想理论,我简化了查找数字到零所需花费多少步骤的代码。

def collatz():
        steps = 0
        sample = int(input('Enter number: '))
        y = sample

    while sample != 1:
        if sample % 2 == 0:
            sample = sample // 2
            steps += 1

        else:
            sample = (sample*3)+1            
            steps += 1

    print('\n')   
    print('Took '+ str(steps)+' steps to get '+ str(y)+' down to 1.')

collatz()

希望这会有所帮助!

答案 2 :(得分:0)

以下是我的代码段,它运行良好

#!/usr/bin/python
def collatz(i):
    if i % 2 == 0:
        n = i // 2
        print n
        if n != 1:
            collatz(n)
    elif i % 2 == 1:
        n = 3 * i + 1       
        print n
        if n != 1:
            collatz(n)
try:
    i = int(raw_input("Enter number:\n"))
    collatz(i)
except ValueError:
    print "Error: You Must enter integer"

答案 3 :(得分:0)

这是我对赋值的解释,它处理负数和重复的非整数输入用例。如果不将代码嵌套在True循环中,则在重复的非整数用例中,代码将失败。

def collatz(number):
if number % 2 == 0:
    print(number // 2)
    return(number // 2)
elif number % 2 == 1:
    result = 3 * number + 1
    print(result)
    return(result)

# Program starts here.        
while True:
    try:
        # Ask for input
        n = input('Please enter a number: ')
        # If number is negative or 0, asks for positive and starts over.
        if int(n) < 1:
            print('Please enter a positive INTEGER!')
            continue
        #If number is applicable, goes through collatz function.
        while n != 1:
            n = collatz(int(n))
    # If input is a non-integer, asks for a valid integer and starts over.
    except ValueError:
        print('Please enter a valid INTEGER!')
    # General catch all for any other error.
    else:
        continue