首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环与Collatz猜想

循环与Collatz猜想
EN

Stack Overflow用户
提问于 2017-06-08 09:27:44
回答 2查看 2.2K关注 0票数 2

循环和声明变量有问题。目前我正在做一个关于Collatz猜想的程序,程序应该检查从一定数量的Collatz序列中达到一个最大步骤是什么。这是我的密码:

代码语言:javascript
复制
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变量,但是我不能让它在任何地方工作,不知道该做什么。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-08 09:35:45

除非你自己试过,否则不要读我的代码。

尝试创建一个列表,将每一个更改附加到列表中,然后获取最后的移动次数,只需获取列表的长度即可。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-06-08 09:43:00

你没有保存你的biggest_steps,只是比较了最后的两个。

我建议你做些改变。

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44431763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档