Python实现图灵机XN*2
一、题目分析
对于XN+1或XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟次Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
二、算法构造
①输入一个数值
②转为二进制并且以逗号结尾的字符串
③根据扩展过程得到目标字符串
④将字符串转为int型的数组array[]
⑤数组输出
⑥根据图灵机XN2的命令将每一步进行输出
⑦对数组元素收缩,将计算的数保存在数组中
⑧将数组转换为字符串
⑨将二进制数转换为十进制得到所求运算结果
三、运算过程
0 0->0 0 R,
0 1->1 0 R,
1 0->0 1 R,
1 1->1 0 0 R,
1 0 0->1 1 1 R,
1 1 0->0 1 STOP
四、流程图
五、代码实现
将二进制数转换为图灵机所需编码
def ConvertNumbers():#def即define,用于定义函数
#将输入的正整数转化为二进制编码形式
#再将二进制编码转化成xn*2图灵机所需编码形式,并存入列表之中
global list1
n1 = input("请输入一个正整数:")
n1 = int (n1)
x = bin(n1).replace("0b",'0')
print(n1,end="")
print('的二进制码为:',end="")
print(x)
y = x + ',' #在二进制码后加上‘,’
z = y.replace('1','10') #将二进制码转化为xn*2图灵机所需编码形式
w = z.replace(',','0110') #将字符串后的‘,’用‘0110’代替
#将字符串转化为列表
list1 = list(w)
#在xn*2图灵机所需编码列表后加入足够的0方便计算
for i in x:
list1.append('0')
print("xn*2图灵机所需编码列表",end="")
print(list1)
图灵机xn*2具体运算过程
def Process():
#图灵机的具体运行过程
global list2
list2 = 0 #list2用于存储图灵机的内态
for i ,j in enumerate(list1):
print("xn*2图灵机第",end="")
print(i+1,end="")
print("次运行结果:")
if j=='0' and list2==0:
list1[i] = '0'
list2 = 0
print(list1)
elif j=='1' and list2==0:
list1[i] = '0'
list2 = 1
print(list1)
elif j=='0' and list2==1:
list1[i] = '1'
list2 = 0
print(list1)
elif j=='1' and list2==1:
list1[i] = '0'
list2 = 10
print(list1)
elif j=='0' and list2==10:
list1[i] = '1'
list2 = 11
print(list1)
elif j=='0' and list2==11:
list1[i] = '1'
list2 = 0
print(list1)
将最后所得结果转换为二进制
def ConvertList():
#将执行完的可执行编码转化成整数形式
s = "".join(list1) #将列表转化为字符串
s1 = s.replace('0110',',') #将字符串中的‘0110’用‘,’代替
s1 = s1.rstrip('0') #去除‘,’右端的所有‘0’
s2 = s1.replace(',','') #去掉字符串后面的‘,’
print("xn*2图灵机运行完成后的编码:",end="")
print(s2)
#xn*2图灵机执行完成后的编码形式转化成二进制编码形式
s3 = s2.replace('10','1')
print("转化为二进制编码为:",end="")
print(s3)
#将二进制数转化为整数形式
n2 = int(s3,base = 2)
print("最终结果为:",end="")
print(n2)
六、运行结果
七、心得体会
本题目十分考验逻辑性,首先得理清楚图灵机XN*2的具体运算过程才能更容易做出来,
模拟图灵机是为了更好地理解它的执行过程,加深了上课所讲知识的理解。