Python中的科拉茨序列

科拉茨数列是一种最后为1的数学数列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。

本文将解释如何用Python编写程序,在任何给定的数字上找到科拉茨序列。

科拉茨数列背后的编程逻辑

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

  1. 检查该数字是偶数还是奇数。
  2. 对于偶数,程序将数字n 除以2并打印出来。
  3. 对于奇数,程序将n 乘以3,然后加1并打印出来。
  4. 程序检查数字n 是否减少到1;如果没有,则再次运行。

对于一个给定的数字5,collatz序列将是-16,8,4,2,1。

下面几节将解释用Python创建显示克拉茨序列的程序的四种方法。

在Python中使用科拉茨数列if-else

下面的程序显示了在Python中寻找collatz序列的一个简单表示。创建了一个方法collatz_seq ,只有一个参数numb

这个程序中使用的逻辑是在一个while 循环中使用一个if-else 语句。首先,程序在方法collatz_seq 中运行一个while 循环,检查变量numb 中的值是否为1。

如果变量numb 不是1,那么程序就会运行第二个检查,用一个if-else 语句来寻找给定的数字是偶数还是奇数。在if 语句中,程序检查数字除以2是否有余数。

if numb % 2 == 0:

如果数字是偶数,程序将其除以2并打印出来。如果数字是奇数,程序将转到elif 语句,其中numb % 2 == 1true

变量numb 乘以3并加到1。最后,该数字被打印出来。

elif numb % 2 == 1:
		numb = (numb * 3) + 1
		print(numb)

这一连串的循环不断地对数字进行检查、更新和打印的操作,直到numb 的值减少到1 ,当numb 的值被发现为1while 循环退出。

最后,调用方法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中的Collatz序列,输入=5 是:

16
8
4
2
1

Python中的Collatz序列使用while 循环和异常处理

前面的例子演示了一个在Python中打印一个给定数字的collatz序列的程序。但是这个程序有很多松散的地方,会导致崩溃。

例如,如果提供一个字符串作为numb 的值,程序就会崩溃。同样,如果提供一个负整数作为输入,程序也会崩溃。

一个程序必须有一个故障安全程序来过滤输入的数据来解决它。

在这个用Python寻找collatz序列的程序中,导入了库包syssys 系统函数在满足一个条件时退出程序。

与上一个程序一样,创建了一个方法collatz_seq ,参数为numb

import sys
def collatz_seq(numb):

一个if-elif 语句检查数字是偶数还是奇数。如果数字是偶数,则该数字被除以2,新的数字被存储在变量value

如果数字是奇数,变量value ,其值分别乘以3和1。

if numb % 2 == 0:
	value = numb // 2
elif numb % 2 != 0:
	value = (3 * numb) + 1

与上一个程序不同的是,更新的结果被存储在value 变量内。在if-elif 块之后,创建了两个while 循环。

第一个while 循环检查变量value 的值是否为1,然后打印并退出循环,如果发现true 。如果value 不是1 ,那么第二个while 循环会打印value ,并将其复制到变量numb 内。

while value == 1:
	print(value)
	sys.exit()
while value != 1:
	print(value)
	n = value

最后,方法collatz_seq 被递归调用,参数为numb 。该方法将不断调用自己,直到value 被减少到1 ,然后程序使用sys.exit() 函数退出。

return collatz_seq(numb)

在方法collatz_seq 之外,创建了一个变量number ,用于接收用户输入。添加了一个异常处理块来捕捉无效的输入。

try 块内,变量number 被作为一个整数输入。一个if 语句被用来检查这个数字是否为负数。

如果发现true ,则改变数字的极性,并打印一个合适的信息。最后,调用方法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

对于一个无效的输入:

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

Python中使用while 循环的Collatz序列

到目前为止,我们已经学会了如何创建一个程序,在Python中打印给定数字的科拉茨序列。在这个程序中,还计算了程序将结果减少到1 的迭代次数。

创建了一个方法solve ,参数是numb 。在一个if 语句中,如果参数的值=0 ,程序就会返回0

创建了一个新的变量,length ,它将被用来计算迭代的次数。

创建一个变量length ,并将其分配给1 。创建一个while 循环,退出条件是numb != 1 。这使循环一直运行,直到numb 的值为1

while 循环中,对numb 的操作由一条语句来执行。如果numb 是偶数,则被2 除以,否则(3 * numb + 1)

这些操作在一条语句中执行,因此length 的值在每次迭代中都会更新。

numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)

numblength 的当前值被打印出来,然后length1 递增。程序检查偶数或奇数,更新numb ,并打印出来。

然后,length ,为下一个操作递增。

在最后一步,程序增加一个额外的1length 。这个额外的数字被减去,然后返回length 的最终计数。

最后,调用方法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序列。