Python最少线挑战(HOTPO / Collat​​z)

时间:2017-06-13 02:29:29

标签: python

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生成此输出所需的最小行数是多少?我的代码可以进一步减少吗?

1 个答案:

答案 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的最后一行:)