Python 中的 Collatz 序列
Collatz数列是一种以1结尾的数字序列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。
本文将解释如何编写程序,在 Python 中找到任何给定数字的 collatz 序列。
Collatz 序列背后的编程逻辑
在 Python 中查找给定数字的 collatz 序列需要遵循四个操作。
- 检查数字是偶数还是奇数。
- 对于偶数,程序将数字 n 除以 2 并打印出来。
- 对于奇数,程序将 n 乘以 3,然后将其加 1 并打印出来。
- 该程序检查数字 n 是否已减少到 1; 如果没有,它会再次运行。
对于给定的数字 5,collatz 序列将为 - 16、8、4、2、1。
以下各节将介绍四种在 Python 中创建显示 collatz 序列的程序的方法。
使用 if-else 在 Python 中使用 Collatz 序列
下面的程序显示了在 Python 中查找 collatz 序列的简单表示。 使用单个参数 numb 创建方法 collatz_seq。
该程序中使用的逻辑在 while 循环中使用了 if-else 语句。 首先,程序在 collatz_seq 方法中运行一个 while 循环来检查变量 numb 中的值是否为 1。
如果变量 numb 不为 1,则程序会使用 if-else 语句运行第二次检查以查找给定数字是偶数还是奇数。 在 if 语句中,程序检查数字除以 2 是否有余数。
if numb % 2 == 0:
如果数字是偶数,程序将它除以 2 并打印出来。 如果数字是奇数,程序将转到 elif 语句,其中 numb % 2 == 1 为真。
变量 numb 乘以 3 并加 1。最后,打印数字。
elif numb % 2 == 1:
numb = (numb * 3) + 1
print(numb)
这一系列循环不断地对数字进行检查、更新和打印操作,直到 numb 的值减为 1,当发现 numb 的值为 1 时,while 循环退出。
最后,调用 collatz_seq 方法,并为参数值传递 5。
def collatz_seq(numb):
while numb != 1:
if numb % 2 == 0:
numb = numb // 2
print(numb)
elif numb % 2 == 1:
numb = (numb * 3) + 1
print(numb)
collatz_seq(5)
它显示了 Python 中输入 = 5 的 collatz 序列是:
16
8
4
2
1
Python 中的 Collatz 序列使用 while 循环和异常处理
前面的示例演示了一个在 Python 中打印给定数字的 collatz 序列的程序。 但是该程序有很多可能导致崩溃的未解决的问题。
例如,如果为 numb 的值提供了一个字符串,程序就会崩溃。 同样,如果提供负整数作为输入,程序也会崩溃。
一个程序必须有一个故障安全程序来过滤输入的数据来解决它。
在这个用 Python 查找 collatz 序列的程序中,库包 sys 被导入。 sys 系统函数在满足条件时退出程序。
就像上一个程序一样,使用参数 numb 创建了一个方法 collatz_seq。
import sys
def collatz_seq(numb):
if-elif 语句检查数字是偶数还是奇数。 如果数字是偶数,则将数字除以 2,并将新数字存储在变量值中。
如果数字是奇数,则变量值存储为分别乘以 3 和 1 的值。
if numb % 2 == 0:
value = numb // 2
elif numb % 2 != 0:
value = (3 * numb) + 1
与上一个程序不同,更新后的结果存储在 value 变量中。 在 if-elif 块之后,创建了两个 while 循环。
第一个 while 循环检查变量 value 的值是否为 1,然后在发现情况为真时打印并退出循环。 如果值不为 1,则第二个 while 循环打印值并将其复制到变量 numb 中。
while value == 1:
print(value)
sys.exit()
while value != 1:
print(value)
n = value
最后,使用参数 numb 递归调用方法 collatz_seq。 该方法将不断调用自身,直到值减为 1,然后程序使用 sys.exit()
函数退出。
return collatz_seq(numb)
在 collatz_seq 方法之外,创建了一个接受用户输入的变量 number。 添加异常处理块以捕获无效输入。
在 try 块内部,变量 number 作为整数输入。 if 语句用于检查数字是否为负数。
如果发现为真,则更改数字的极性,并打印一条合适的消息。 最后,调用 collatz_seq 方法。
print('Enter a number: ')
try:
number = int(input())
if number < 0:
number = abs(number)
print("A negative number entered")
collatz_seq(number)
在 except 块内,对于整数以外的输入会引发 ValueError 以及一条错误消息。
except ValueError:
print('You must enter an integer type.')
完整代码如下。
import sys
def collatz_seq(numb):
if numb % 2 == 0: # Remainder = 0, Checks for even number
value = numb // 2
elif numb % 2 != 0: # Remainder = 1, Checks for odd number
value = (numb*3)+1
while value == 1: # If value is 1
print(value)
sys.exit() # Program exits
while value != 1: # The loop runs until the value is not 1.
print(value)
numb = value # Value of value is copied to numb
return collatz_seq(numb)
print('Enter a number: ') # Input statement
try:
number = int(input()) # Typecast as Integer Input
if number < 0:
number = abs(number)
print("A negative number entered")
collatz_seq(number)
except ValueError:
print('You must enter an integer type.')
输出:
Enter a number:
10
5
16
8
4
2
1
For an invalid input:
Enter a number:
j
You must enter an integer type.
Python 中使用递归的 Collatz 序列
该程序使用不同的方法调用在 Python 中查找 collatz 序列。 with 块是在 collatz 方法之外创建的,以让程序在给定的次数内持续获取输入。
collatz 方法检查数字是偶数还是奇数,并像前面的程序一样对其执行操作。 在方法之外,程序需要两个输入; 第一个采用一系列 for 循环。
在 try 块内,提供了第二个输入。 while 循环不断调用方法 collatz,直到 numb 的值减少到 1。
在 while 循环内部,numb 的值被反复传递和返回。
def collatz_seq(numb):
if numb % 2 == 0: # even
print(numb // 2)
return numb // 2
elif numb % 2 != 0: # odd
value = 3 * numb + 1
print(value)
return value
c = int(input('Enter count: '))
for c in range(c):
try:
n = input('Enter number: ')
while n != 1:
n = collatz_seq(int(n))
except ValueError:
print('Value Error. Please enter integer.')
输出:
Enter count: 2
Enter number: 5
16
8
4
2
1
Enter number: 6
3
10
5
16
8
4
2
1
使用 while 循环在 Python 中使用 Collatz 序列
到目前为止,我们已经学习了如何创建一个程序来在 Python 中打印给定数字的 collatz 序列。 在这个程序中,还计算了程序将结果减少到 1 所花费的迭代次数。
使用参数 numb 创建方法 solve。 在 if 语句中,如果给定的参数值为 0,则程序返回 0。
创建了一个新变量 length,它将用于计算迭代次数。
创建一个可变长度并为其分配 1。 创建一个 while 循环,退出条件为 numb != 1。这会使循环一直运行,直到 numb 的值为 1。
在 while 循环内,对 numb 的操作由单个语句执行。 如果 numb 是偶数,则除以 2,否则 (3 * numb + 1)。
这些操作在单个语句中执行,因此每次迭代都会更新长度的值。
numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)
打印 numb 和 length 的当前值,然后 length 加 1。程序检查偶数或奇数,更新 numb,并打印它。
然后为下一个操作增加长度。
在最后一步中,程序将长度额外增加 1。 减去这个额外的数字,返回最终的长度计数。
最后,调用方法 solve 并传递一个参数 10,然后打印结果。
def solve(numb):
if numb == 0:
return 0
length = 1
while numb != 1:
numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)
print("Count = ", length, "Value = ", numb)
length += 1
return length-1
print("Total iterations = ", solve(10))
输出:
Count = 1 Value = 5.0
Count = 2 Value = 16.0
Count = 3 Value = 8.0
Count = 4 Value = 4.0
Count = 5 Value = 2.0
Count = 6 Value = 1.0
Total iterations = 6
总结
本文提供了创建在 Python 中显示 collatz 序列的程序的各种示例。 阅读本文后,读者可以通过多种方式在 Python 中创建 collatz 序列。
相关文章
Python 中的最长递增子序列
发布时间:2023/06/16 浏览次数:90 分类:Python
-
我们将学习什么是子序列以及如何使用 Python 中的 n 平方方法和二分搜索方法计算数组中最长的递增子序列。
使用 Python 将文件上传到 Google 云端硬盘
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文将介绍我们如何使用 Python 将文件上传到云盘,以 Google Drive 为例。 为此,我们将使用 Google Drive API。
Python 子进程捕获输出
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文的主要目的是演示如何在 Python 中捕获、存储和显示子进程的输出。Python 子进程捕获输出 Subprocess 是一个内置的 Python 模块,预装了 Python 安装文件。
Python 子进程在运行时读取标准输出
发布时间:2023/06/15 浏览次数:129 分类:Python
-
本文的主要目的是演示如何读取在 Python 中执行的子进程的标准输出。Python 子进程在运行时读取标准输出 与许多其他内置模块一样,Subprocess 也是一个内置模块,预装了“正常”Python 安装。
使用 Python 获取 CPU 数量
发布时间:2023/06/15 浏览次数:173 分类:Python
-
CPU 可以包含单核或多核。 单核只处理一个进程,而多核同时处理多个进程。本篇文章将介绍使用 Python 程序查找 CPU 内核总数的不同方法。使用 multiprocessing 模块获取 Python 中的 CPU 数量
Python获取CPU温度
发布时间:2023/06/15 浏览次数:111 分类:Python
-
本文的主要目的是演示如何借助 Python 中的 pythonnet 库读取和显示 CPU 温度。Python获取CPU温度
Python 从网页中提取表格
发布时间:2023/06/15 浏览次数:50 分类:Python
-
本文的主要目的是演示如何在 Python 中使用 Pandas 和 lxml 从网页中提取表格。Python 从网页中提取表格
Python Antigravity 模块的用途
发布时间:2023/06/15 浏览次数:72 分类:Python
-
一个这样的 Python 彩蛋是反重力模块。让我们看看 Antigravity 模块做了什么,并看看其他几个例子。
不使用 pip 安装 Python 包
发布时间:2023/06/15 浏览次数:189 分类:Python
-
在本文中,我们将学习如何在 Python 中安装没有 pip 的库。 我们还将学习如何使用 conda 命令在 Python 中安装包。不使用 pip 命令安装 Python 库