在collat​​z猜想中计数步骤

时间:2018-07-04 15:18:07

标签: python

我想知道从n(在示例15中)到1所需的总步骤。
到目前为止,这是我设法做到的:

def collatz(n):
    print(n)
    c = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
            c += 1
            yield(n)
            yield ('{%d}' % c)
        else:
            n = n * 3 + 1
            c += 1
            yield(n)
            yield ('{%d}' % c)


print(list(collatz(15)))

这就是我得到的。它提供了所有步骤,但我只需要它们的总数(在示例17中)。

[46, '{1}', 23, '{2}', 70, '{3}', 35, '{4}', 106, '{5}', 53, '{6}', 160, '{7}', 80, '{8}', 40, '{9}', 20, '{10}', 10, '{11}', 5, '{12}', 16, '{13}', 8, '{14}', 4, '{15}', 2, '{16}', 1, '{17}']

3 个答案:

答案 0 :(得分:0)

简单地reverse list

print(reversed(list(collatz(15))))

并获取最后一个号码:

print(list(collatz(15))[-1]) #for '{17}'
print(list(collatz(15))[-2]) #for 1

答案 1 :(得分:0)

不要用计数污染您的输出。而是从可迭代的外部计算可迭代的元素。

def collatz(n):
 while n != 1:
    if n % 2 == 0:
        n = n // 2
        yield(n)
    else:
        n = n * 3 + 1
        yield(n)

print(len(list(collatz(15))))  # More obvious what's happening
# 17
print(sum(1 for _ in collatz(15)))  # Doesn't keep a list of results we don't care about
# 17

答案 2 :(得分:0)

试试这个:-

def collatz(n):
    var = 0
    while n != 1:
        if n % 2 == 0:
           n = n // 2
           var  += 1
        else:
            n = n * 3 + 1
            var += 1
    return var

print(collatz(32)) # output --> 5