Python 循环与Collatz猜想
我在循环和声明变量方面有问题。目前我正在做一个关于Collatz猜想的程序,该程序应该检查从一定数量的Collatz序列中达到一个猜想的最大步骤是什么。这是我的密码:Python 循环与Collatz猜想,python,python-3.x,loops,Python,Python 3.x,Loops,我在循环和声明变量方面有问题。目前我正在做一个关于Collatz猜想的程序,该程序应该检查从一定数量的Collatz序列中达到一个猜想的最大步骤是什么。这是我的密码: start_num = int(input("insert a starting Number > ")) how_many = int(input("how many times you want to check? >")) def even_or_odd(number): if number % 2
start_num = int(input("insert a starting Number > "))
how_many = int(input("how many times you want to check? >"))
def even_or_odd(number):
if number % 2 == 0:
return 'isEven'
else:
return 'notEven'
def collatz(n):
z = n
counter = 0
while True:
if n != 1:
if even_or_odd(n) == 'isEven':
n = n/2
counter += 1
continue
if even_or_odd(n) == 'notEven':
n = (n*3)+1
counter += 1
continue
else:
print('number ' + str(z) + ' reached 1 with : ' + str(counter) + ' steps')
return counter
break
def check_biggest_steps(steps_before, steps_after):
if steps_before > steps_after:
return steps_before
if steps_after > steps_before:
return steps_after
if steps_after == steps_before:
return steps_after
def compute_collatz(n_times, collatz_number):
for _ in range(n_times):
before = collatz(collatz_number)
collatz_number += 1
after = collatz(collatz_number)
collatz_number += 1
biggest_steps = check_biggest_steps(before, after)
print('Biggest Steps is :' + str(biggest_steps))
compute_collatz(how_many, start_num)
此
最大\u步数
变量始终返回最后2步数。我知道导致这个问题的原因是最大步长
变量位于循环内部,但我无法使它在任何地方工作,我不知道该怎么办。谢谢在您自己尝试之前不要阅读我的代码
试着制作一个列表,将每一个更改都附加到一个列表中,然后获取最后的移动次数,只需获取列表的长度即可
你没有保存最大的步骤,总是只比较最后两个步骤 我建议进行以下更改
def compute_collatz(n_times, collatz_number):
biggest_steps = 0
for _ in range(n_times):
steps = collatz(collatz_number)
if steps > biggest_steps:
biggest_steps = steps
collatz_number += 1
print('Biggest Steps is :' + str(biggest_steps))
您的
偶数或奇数
函数相当复杂。。嗯,奇怪。将它命名为偶数
或为偶数
,并让它返回真
或假
,这样调用代码就可以执行如果是偶数(n):
。如果您这样做,它是一个单行程序-不需要if
语句,只需返回not n%2
-因此您可能决定取消该函数,只需在collatz
中使用该条件。同样,你可以用max(before,after)
替换整个check\u maximum\u steps
函数。事实上,在我发布这篇文章后(是的,我刚醒来就写了这篇文章),我就想到了异常处理,我甚至没有意识到list
是一个很好的工具。非常感谢。没问题,再看一眼代码,我已经清理了一点。Wtf,这太糟糕了-OP有个好主意,只保留序列的长度-只使用日志(len(list_))内存。使用全局变量会让你很难受的,有什么可怕的?它展示了一种思考它的方式,并想象它在做什么。您可以只使用一个计数,将其包装在一个函数中。你太迂腐了,这不是代码库,他在学习语言……那是错误的。此步骤将改为使用collatz编号。
def compute_collatz(n_times, collatz_number):
biggest_steps = 0
for _ in range(n_times):
steps = collatz(collatz_number)
if steps > biggest_steps:
biggest_steps = steps
collatz_number += 1
print('Biggest Steps is :' + str(biggest_steps))