我试图找到由以下算法给出的Collatz猜想序列的长度:
我正在运行的代码是:
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生成器实现相同的功能吗?并且使用生成器可以改进实现算法,性能明智吗?
答案 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
的结果 - 那么使用生成器是有意义的。