python 实现图灵机 XN*2 模拟
一. 题目分析
通过编程模拟某一图灵机的工作过程,掌握图灵机的概念与基本结构。将图灵机内态变化及指令输出用高级语言实现逐行输出。从而理解图灵机的编码方式。
二. 算法构造
- 实现输入十进制整数的二进制编码,并将其转化为二进制扩展码。
- 选择图灵机(XN*2),将1转化过来的二进制扩展码用if(elif)语句实现判断后的图灵机指令操作。
- Show_binary函数对2中turing_operate操作后的二进制码(字符串)进行输出。
- 调用方法,实现完整功能
三. 算法实现
Python(Pycharm)编译
def conversion_nu():
decimalism = int(input("请输入您的整数:"))
binary = bin(decimalism).replace('0b', '') # bin 函数转化十进制
print("转化为二进制为:"+binary)
tensor = list(map(int, binary)) # 将二进制转为列表
if tensor[0] == '0': # 判断输入值0时的情况
return 0
else:
new_tensor = [0, 1, 0] # 任何非零数据转化二进制第一位010
for a in tensor[1:]:
if a == 1:
new_tensor.append(10) # 对第二位后的值进行操作,将操作值存在new_tensor中
else:
if a == 0:
new_tensor.append(0)
new_tensor.append(110)
return new_tensor # 返回值作为turing_operate 的参数
'''turing machine operation
'''
def turing_operate(new_tensor):
tend = [str(i) for i in new_tensor]
tend.append("0") # 内态补位操作
tend.append('0')
a = ''.join(tend)
eve_tend = list(a) # 转化为单值字符
state = '0' # 初始化内态
arr = []
'''
图灵机操作
'''
for i in range(0, len(eve_tend)):
print("第" + str(i+1) + "步")
if state == '0 'and eve_tend[i] == '0':
state = '0'
eve_tend[i] = '0'
elif state == '0' and eve_tend[i] == '1':
state = '1'
eve_tend[i] = '0'
elif state == '1' and eve_tend[i] == '0':
state = '0'
eve_tend[i] = '1'
elif state == '1' and eve_tend[i] == '1':
state = '10'
eve_tend[i] = '0'
elif state == '10' and eve_tend[i] == '0':
state = '11'
eve_tend[i] = '1'
elif state == '11' and eve_tend[i] == '0':
state = '0'
eve_tend[i] = '1'
arr.append(eve_tend)
carry = [str(i) for i in eve_tend] # 聚合操作后的列表
temp = ''.join(carry)
print("当前内态: "+state+" "+"当前扩展码: "+temp)
print("stop")
return arr
def binary_to_metric(arr):
metric = arr[0]
tes = [int(i) for i in metric]
#print(tes)
final = []
for e in range(0, len(tes)):
if tes[e] == 1 and tes[e + 1] == 0:
final.append(1)
elif (e + 1) < len(tes) and tes[e] == 0 and tes[e + 1] == 0:
final.append(0)
elif tes[e] == 1 and tes[e + 1] == 1 and tes[e + 2] == 0:
final.append(',')
break
final.remove(',')
ls = [str(i) for i in final]
ls1 = ''.join(ls)
print('转化完成的二进制码为:' + ls1)
F = int(ls1, 2)
print("XN*2: ", end=" ")
print(F)
"""
调用函数
"""
s = conversion_nu() # 调用
h = turing_operate(s) # 函数作为参数传入
binary_to_metric(h)
四. 调试,测试及运行结果
小数据测试较大数据测试
五. 经验归纳
本次程序设计,算法相对来说较为简单明了,实现起来不算困难,但因为自学了python,想用python 完成此次编程。由于是第一次用python写具有功能性的代码,遇到了不少困难。首先是函数间参数传入问题,c++及java中都不存在__init__函数(self)参数的问题,参数传入较好理解,python中此参数让人备受困扰,在查阅相关博客时还学习到python可以将类内函数作为另一函数的参数传入,在Java中只能做到函数间的相互调用。其次是python的对象函数调用,因为没有python的编程经验,此方面花了不少时间,但也学到了面对对象的方法在不同语言中的通用性及区别。
补充:
1.当python出现列表套列表时,可将里边的列表当作是外边的列表元素处理,将里边的列表剥离出来时只需要另新建变量使其等于外边列表的其所处的索引。
2.python函数之间传值时可能会出现值变化的情况,此时一定要注意传参顺序,和传参的数据类型。另外,python可将函数作为参数传入另一个函数,此时就需要注意函数是否被重复调用。