我想知道从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}']
答案 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