迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的 Collatz 序列

作者:迹忆客 最近更新:2023/06/16 浏览次数:

Collatz数列是一种以1结尾的数字序列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。

本文将解释如何编写程序,在 Python 中找到任何给定数字的 collatz 序列。


Collatz 序列背后的编程逻辑

在 Python 中查找给定数字的 collatz 序列需要遵循四个操作。

  1. 检查数字是偶数还是奇数。
  2. 对于偶数,程序将数字 n 除以 2 并打印出来。
  3. 对于奇数,程序将 n 乘以 3,然后将其加 1 并打印出来。
  4. 该程序检查数字 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 中的最长递增子序列

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中的最长递增子序列

发布时间:2023/06/16 浏览次数:90 分类:Python

我们将学习什么是子序列以及如何使用 Python 中的 n 平方方法和二分搜索方法计算数组中最长的递增子序列。

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 库

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便