100个python算法超详细讲解:角谷猜想

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。因此,它们都符
合角谷猜想的结论。读者也可以任意输入其他自然数进行验证。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lee达森

创作不易,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值