循环和Collat​​z猜想

时间:2017-06-08 09:27:45

标签: python python-3.x loops

我遇到循环和声明变量的问题。目前我正在制作一个关于Collat​​z Conjecture的程序,该程序应该检查从一定数量的Collat​​z序列到达一个的最大步骤。这是我的代码:

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)

biggest_steps变量始终返回最后两步。我知道造成这个问题的原因是biggest_step变量位于循环内部,但是我无法在任何不知道该怎么做的地方工作。感谢

2 个答案:

答案 0 :(得分:1)

在您自己尝试之前,请不要阅读我的代码。

尝试制作一个列表,将每个更改附加到列表中,然后在结尾处获取移动的数量,只需获取列表的长度。

def collatz(x):
    while x != 1:
        if x % 2 > 0:
             x =((3 * x) + 1)
             list_.append(x)
        else:
            x = (x / 2)
            list_.append(x)
    return list_


print('Please enter a number: ', end='')
while True:
    try:
        x = int(input())
        list_ = [x]
        break
    except ValueError:
        print('Invaid selection, try again: ', end='')


l = collatz(x)

print('\nList:', l, sep=' ')
print('Number of steps required:', len(l) - 1)

答案 1 :(得分:1)

你没有保存你的最大步数,只比较了最后两个。

我建议跟随改变。

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))