前言
【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用Ruby实现的。这里是用python来实现。
考拉慈猜想
对自然数n循环执行如下操作。
- n是偶数时,用n除以2
- n是奇数时,用n乘以3后加1
如此循环操作的话,无论初始值是什么数字,最终都会得到1(会进入1-->4-->2-->1这个循环)。
问题描述
稍微修改一下这个猜想的内容,假设初始值为偶数时,也用n乘以3后加1,但只是在第一次这样操作,后面的循环操作不变。而我们要考虑的则是在这个条件下最终又能回到初始值的数。
如,以2为初始值,则计算过程如下:
2-->7-->22-->11-->34-->17-->52-->26-->13-->40-->20-->10-->5-->16-->8-->4-->2
如,以4为初始值,则计算过程如下:
4-->13-->40-->20-->10-->5-->16-->8-->4
但是初始值为6,则计算过程如下,并不能回到初始值6:
6-->19-->58-->29-->88-->44-->22-->11-->34-->17-->52-->26-->13-->40-->20-->10-->5-->16-->8-->4-->2-->1-->4-->...
求在小于10000的偶数中,像上述的2或者4这样"能回到初始值的数”有多少个?
思路
考拉慈猜想是无论初始值是什么数字,最终都能计算得到1。现在只是改变初始值计算方式,如果继续计算下去,最终都会得到1。那么只要在得到1之前就返回初始值,就找到了我们所要的值。这里就能用到while循环来记录计算过程。
python3实现
def is_return(n):
next_value = 3 * n + 1
while next_value != 1:
if next_value == n:
return True
next_value = next_value/2 if next_value % 2 == 0 else 3 * next_value + 1
return False
count = 0
for i in range(2, 10000, 2):
if is_return(i):
count = count + 1
print(count)
运行,结果就是34.