1.问题描述
角谷猜想在西方常被称为西拉古斯猜想,据说这个问题首先是在
美国的西拉古斯大学被研究的,而在东方,这个问题则由将它带到日
本的日本数学家角谷静夫的名字来命名,故被称为角谷猜想。
角谷猜想的内容是任给一个自然数,若为偶数则除以2,若为奇数
则乘以3再加1,这样得到一个新的自然数之后再按照前面的法则继续
演算,若干次以后得到的结果必然为1。在数学文献里,角谷猜想也常
常被称为“3X+1问题”。请编程验证角谷猜想。
2.问题分析
先通过几个实例来理解角谷猜想的含义。
取自然数n=6,则根据角谷猜想,有:
6→3→10→5→16→8→4→2→1。
最终结果为1,则n=6时角谷猜想成立。
取自然数n=15,则根据角谷猜想,有:
15→46→23→70→35→106→53→160→80→40→20→10→5→16→
8→4→2→1。
最终结果为1,则n=15时角谷猜想成立。
读者还可取其他的自然数按照上述规则来演算,结果都为1。
虽然角谷猜想还未获得一般的证明,但是已经有人拿各种各样的
数字来进行试验,结果发现角谷猜想总是成立的,现在已经获得验证
的最大数是1 099 511 627 776。
3.算法分析
角谷猜想中已经明确地给出了处理过程,即对于给定的自然数n,
有如下函数:

在问题分析中进行的变换,实际上是对函数C进行迭代。则问题可
表述为:从任意一个自然数开始,经过对函数C有限次的迭代,能否最
终得到1。
算法不需要特别的设计,根据函数C可直接进行角谷猜想的验证。
4.确定程序框架
在main()函数中构建一个不定次数的while循环。定义变量n表示输
入的自然数,在循环体中判断n的奇偶性并根据奇偶性的不同执行不同
的操作,当n=1时,退出while循环。while循环结构如下:

while n != 1: # 当n=1时终止循环
# 若n为奇数,则乘以3加1
if n % 2 == 1:
n = n * 3 + 1
count += 1
# 输出执行步骤
print("[%d]: %d * 3 + 1 = %d "
%(count, (n-1)//3, n))
else:
n //= 2 # 若n为偶数,则直接除以2
count += 1
print("[%d]: %d / 2 = %d " %(count,
2 * n, n)) # 输出执行步骤

程序的流程图如图10.9所示。

5.完整的程序
根据上面的分析,编写完整的程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 角谷猜想
# 任给一个自然数,若为偶数则除以2,若为奇数则乘以3再加1
# 这样得到一个新的自然数之后再按照前面的法则继续演算,若干次以后得到的结果必然为1
if __name__ == "__main__":
count = 0
n = int(input("请输入一个自然数:"))
while n != 1: # 当n=1时终止循环
if n % 2 == 1: # 若n为奇数,则乘以3加1
n = n * 3 + 1
count += 1
# 输出执行步骤
print("[%d]: %d * 3 + 1 = %d " %(count, (n-1)//3, n))
else:
n //= 2 # 若n为偶数,则直接除以2
count += 1
print("[%d]: %d / 2 = %d " %(count, 2 * n, n)) # 输出执行步骤

6.运行结果
在PyCharm下运行程序,结果如图10.10所示。在图10.10a中打印出
了n=6时按照角谷猜想的执行步骤,最后结果为1;在图10.10b中打印出
了n=15时按照角谷猜想的执行步骤,最后结果也为1。因此,它们都符
合角谷猜想的结论。读者也可以任意输入其他自然数进行验证。

100个python算法超详细讲解:角谷猜想相关推荐

  1. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  2. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  3. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  4. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

  5. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  6. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

  7. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

  8. 100个python算法超详细讲解:矩阵转置

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 编写一个程序,将一个3行3列的矩阵进行转置. 2.问题分析 要解决该问题首先应该清楚什么是矩阵的转置.矩阵转置在数学 上的定义为: 设A ...

  9. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  10. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

最新文章

  1. 计算机网络有限制,计算机网络中软件限制策略的应用规则有哪些
  2. 恭喜《软件随想录》得到了大家的一致认可!
  3. IOS中的JSON数据的解析
  4. C语言函数集(十三)
  5. Qt/C++主窗口和子窗口之间传递参数
  6. 今日话题:月薪过万真的很难吗?
  7. 《Spring》(六)---- Bean的scope
  8. C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果
  9. 系统延时任务及定时任务
  10. 和项目组研究计算几何
  11. 浅谈基于软交换的下一代网络技术
  12. 编程到底该用 Tab 还是 Space?比尔·盖茨也来挑事儿
  13. 6.java中什么是类_类、对象(java基础知识六)
  14. keras简介(一)
  15. (1)了解cocostudio基础
  16. 【Widevine L1】MTK平台基于Trustonic TEE方案widevine keybox异常log
  17. Android闪闪发光字体
  18. oracle是gbk程序是utf8的,oracle数据库gbk转utf8
  19. react中使用AlipayJSBridge 支付宝支付调用接口在H5网页的应用
  20. 手把手教会你如何玩转SpringMVC

热门文章

  1. 王老吉地震营销的网络推广
  2. 有限元:有限元法概述
  3. android中获取打气筒服务的三种形式
  4. Mac系统下MySQL的下载安装和配置教程
  5. 测试ikbc键盘的软件,有趣的时钟 测ikbc F-108 RGB机械键盘
  6. TimerTask倒计时
  7. iOS进阶 :【NSProxy模拟多继承】作为一个委托代理对象,将消息转发给一个真实的对象或者自己加载的对象
  8. PLsql绿色免安装手顺
  9. Unity Shader 燃烧消融效果(surface表面着色器)
  10. RTL8201F芯片配置(LWIP_FreeRTOS)