很抱歉,如果有人提出类似的问题,但我找不到任何解决方法。我已经为Python中的Collatz序列编写了一段简单的代码,该代码对于偶数似乎很好用,但是当输入奇数时陷入无限循环。
我无法弄清楚为什么会这样,或者无法打破这种循环,因此不胜感激。
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)
答案 0 :(得分:0)
您的函数缺少任何return
语句,因此默认情况下它返回None
。您可能希望定义函数,以便它返回距输入数字1
有多少步。您甚至可以选择cache这样的结果。
您似乎想进行递归调用,但是您还使用了while
循环。选择一个或另一个。
递归时,您不必重新分配变量,可以选择将表达式放入调用中,如下所示:
if number % 2 == 0:
collatz(number / 2)
elif ...
这给我们带来了问题的症结。在递归过程中,您创建了许多堆栈框架,每个框架都有其自己的名为number
的私有变量,并且包含不同的值。通过更改当前堆栈帧中的number
, 并在进行递归调用时将其复制到下一个级别帧,您将感到困惑。在偶数情况下,这适用于您的终止子句,但在奇数情况下则不行。只需进行while
循环而根本不进行递归,您会更好。
您可能会发现http://pythontutor.com/可帮助您了解正在发生的事情。 2的幂的输入将终止,但是您会看到从栈中弹出那些多余的帧花了很长时间。
答案 1 :(得分:0)
根据Collatz猜想理论,我简化了查找数字到零所需花费多少步骤的代码。
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