【算法趣题】Q06(改版)考拉慈猜想

浏览: 1568

前言

【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用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.

推荐 1
本文由 _缘君_ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册