Python中的科拉茨序列
科拉茨数列是一种最后为1的数学数列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。
本文将解释如何用Python编写程序,在任何给定的数字上找到科拉茨序列。
科拉茨数列背后的编程逻辑
在Python中找到一个给定的数字的collatz序列需要遵循四个操作。
- 检查该数字是偶数还是奇数。
- 对于偶数,程序将数字
n
除以2并打印出来。 - 对于奇数,程序将
n
乘以3,然后加1并打印出来。 - 程序检查数字
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 == 1
是true
。
变量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中的Collatz序列,输入=5
是:
16
8
4
2
1
Python中的Collatz序列使用while
循环和异常处理
前面的例子演示了一个在Python中打印一个给定数字的collatz序列的程序。但是这个程序有很多松散的地方,会导致崩溃。
例如,如果提供一个字符串作为numb
的值,程序就会崩溃。同样,如果提供一个负整数作为输入,程序也会崩溃。
一个程序必须有一个故障安全程序来过滤输入的数据来解决它。
在这个用Python寻找collatz序列的程序中,导入了库包sys
。sys
系统函数在满足一个条件时退出程序。
与上一个程序一样,创建了一个方法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)
numb
和length
的当前值被打印出来,然后length
被1
递增。程序检查偶数或奇数,更新numb
,并打印出来。
然后,length
,为下一个操作递增。
在最后一步,程序增加一个额外的1
到length
。这个额外的数字被减去,然后返回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序列。