Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环与Collatz猜想_Python_Python 3.x_Loops - Fatal编程技术网

Python 循环与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

我在循环和声明变量方面有问题。目前我正在做一个关于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 == 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))