使用python生成器Collat​​z猜想序列长度

时间:2013-12-25 03:40:43

标签: python algorithm sequences

我试图找到由以下算法给出的Collat​​z猜想序列的长度:

enter image description here

我正在运行的代码是:

def get_count(n):
    i = 1
    while n != 1:
        (n, i) = (3*n+1 if n%2 else n/2, i + 1)
    return i

我可以使用python生成器实现相同的功能吗?并且使用生成器可以改进实现算法,性能明智吗?

2 个答案:

答案 0 :(得分:1)

  

我可以使用python生成器实现它吗?

是的,您可以产生每个连续的值。然后你可以在生成器函数上应用itertools.takewhile。然后你可以使用this piece of code来查找迭代器的长度。

  

使用生成器是否可以改善实现算法的性能?

我认为较慢,因为其他一些代码用于处理生成器,从而产生开销。

P.S。不要在while循环中递增i,而是使用for i in itertools.count (1)(itertools.count与范围相同,除了停止值是无限的)。

答案 1 :(得分:1)

生成器版本:

def get_count(n):
    i = 1
    while n != 1:
        (n, i) = (3*n+1 if n%2 else n/2, i + 1)
        yield (n, i)

# usage:  
g = get_count(3)
for x in g:
    print x

<强>输出:

(10, 2)
(5, 3)
(16, 4)
(8, 5)
(4, 6)
(2, 7)
(1, 8)

在这种情况下使用生成器不会改进任何内容,因为只有当您到达i(最后一次迭代)时,最终结果才会存储在n == 1中。

当每次迭代提供可以在以后的调用中使用的实质结果时(使用类似动态编程),使用生成器具有意义。因此,例如,如果您想计算factorial(n),但又想知道每factorial(k) k < n的结果 - 那么使用生成器是有意义的。