本文主要是介绍图灵机原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图灵机原理
组成
一个两头无延伸的纸带,一个读写头,一本操作手册。
格式
纸带上只能写 0 和 1。
读写头可以在纸带上左右移动。
手册的每一页都有“一个判断”和“三个操作”:
-
一个判断:判断读写头当前位置的值是 0 还是 1,根据不同的值,选择不同的操作(每页都有两组动作,分别对应 0 和 1 的情况,每组动作都执行三个操作)。
-
三个操作:1、如何修改当前位置的值(0 或 1),2、如何移动读写头(左、右、原地不动),3、翻到指定的手册页
启动
在开始执行前,需要做一些初始化操作:
-
把程序代码(0 和 1 的序列)写到纸带上,纸带上要有初始信息给读写头读取。
-
将读写头定位到初始位置(程序要求的初始位置),
-
指定操作手册(一个二维数组)
-
指定手册的初始页面(程序要求的初始页面)。
-
指定一个或多个手册页作为“停机”页面,当到达该页面时,则停止运行。
运行
-
翻到手册的初始页面,
-
如果当前页面是“停机”页面,则停止运行。
-
如果不是“停机”页面,则判断当前位置的值是 0 还是 1,并选择相应的动作。
-
根据动作要求,修改当前位置的值。
-
根据动作要求,移动读写头。
-
根据动作要求,翻到指定的手册页面。
-
回到第 2 步重复执行。
JavaScript 示例
// 图灵机// program : 纸带(存储程序和执行结果)
// position : 初始位置
// manual : 操作手册(二维数组)
// page : 初始页面
// stop : 停机页面(数组,可指定多个停机页面)
function run(program, position, manual, page, stop) {// 通过查询手册得到的“新值”和“移动方向”let value, direction;// 循环直到页码为停机页面while (! stop.includes(page)) {// 读取当前位置的值value = program[position];// 查询手册,获取新值、移动方向、新页面[value, direction, page] = manual[page][value];// 赋值program[position] = value;// 移动position += direction;};
}// 操作手册(该手册实现加法运算)
const plus_manual = {// 旧页面: {旧值: [新值, 移动方向, 新页面]}0: {0: [1, 1, 1], 1: [1, 1, 0]},1: {0: [0, -1, 2], 1: [1, 1, 1]},2: {0: [0, 0, 3], 1: [0, 0, 3]},
};// 手册其实就是一个二维数组
//const plus_manual = [
// // [新值, 移动方向, 新页面]
// [[1, 1, 1], [1, 1, 0]],
// [[0, -1, 2], [1, 1, 1]],
// [[0, 0, 3], [0, 0, 3]],
//];// 程序(计算4+3)
let program = [1,1,1,1,0,1,1,1,0];// 启动
run(program, 0, plus_manual, 0, [3]);// 显示结果
console.log(program);// 结果 = 7
// [1, 1, 1, 1, 1, 1, 1, 0, 0]// 这个图灵机是以 bit 为移动单位,每个格子只能存储 0 和 1,而实际的计算机是以 Byte(8 bit)为移动单位,每个格子可以存储 0-255 的值。
视频演示:https://www.bilibili.com/video/BV1br4y1N762/
视频演示:https://www.bilibili.com/video/BV1VS4y1a7JD/
这篇关于图灵机原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!