Collatz Conjecture,也称为Half或Triple Plus One(HOTPO),取任何正整数n开始。
如果n是偶数,则除以2。如果n是奇数,则将其乘以3并加1。猜想是无论您从哪个数开始,它总是会达到1.
面临的挑战是编写一个程序,输出n的所有值以及它所采取的步骤数。例如,n = 3时,输出应为:
3
10
5
16
8
4
2
1
Finished. 7 steps required.
我最好的尝试需要6行:
x = [3]
while x[-1] != 1:
if x[-1] % 2 == 1: x.append(3*x[-1]+1)
x.append(x[-1]/2)
for num in x: print num
print "Finished. " + str(len(x)-1) + " steps needed."
为任何合理大小的n生成此输出所需的最小行数是多少?我的代码可以进一步减少吗?
答案 0 :(得分:0)
利用lambda函数的一些改进:
x=[3]
while x[-1] != 1:
x.append((lambda n: n%2==0 and n/2 or 3*n+1)(x[-1]))
print(x[-1])
print "Finished. " + str(len(x)-1) + " steps needed."
我只是在一行中添加了更多代码,现在只有一个循环而不是两个循环,可以在与计算相同的循环中完成打印。
或者因为它是至少行数,你可以使用两个一行循环并将其分为3行:
x=[3]
while x[-1]!=1: x=(lambda y: y+[(lambda n: n%2==0 and n/2 or 3*n+1)(x[-1])])(x)
print("\n".join([str(y) for y in x])+"\nFinished. {} steps required.".format(len(x)-1))
感谢Pythonista的最后一行:)