Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一起了解大名鼎鼎的“图灵机”

一起了解大名鼎鼎的“图灵机”

作者头像
讲编程的高老师
发布于 2020-08-14 02:03:45
发布于 2020-08-14 02:03:45
4.4K0
举报

1936年,英国数学家阿兰・麦席森・图灵(1912―-1954年)提出了一种抽象的计算模型——图灵机( Turing machine)。图灵机,又称图灵计算机,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。

图灵提出的著名的图灵机模型为现代计算机的逻辑工作方式奠定了基础。

01

概念

图灵机是由英国数学家图灵在一篇论文《论数字计算在决断难题中的应用》(《On Computable Numbers, with an Application to the Entscheidungsproblem》)中提出的一种理想机器,这种机器可以通过一些简单的、机械的步骤模拟人类的一切数学运算。

“图灵机”设想有一条无限长的纸条,纸条上有一个个方格,每个方格可以存储一个符号,纸条可以向左或向右运动。这个纸带就像我们现代的计算机的存储器一样,纸带上面的每个格子是可以被读写的,在图 31这个例子里,机器只能写0、1、或者什么也不写。这个机器就是包含3种信号的图灵机(3-Symbol Turing machine)。

图1 图灵机设想的无限长纸袋

图灵机可以做下面三个基本的操作:

(1). 读取指针头指向的方格内的内容;

(2). 修改方框中的字符或者直接擦除方格内的内容;

(3). 将纸带向左或右移动,以便修改其临近方框的值。

02

一个简单的例子

一个简单的例子:这个例子实现的功能在纸带上打印“110”。如下面的图中所示,其中黑色框表示探头所在的位置。具体步骤为:(1)探头写1;(2)把纸带向左移动一格;(3)探头写1;(4)把带子向左移动一格;(5)探头写0。

图2 在图灵机的无限纸带上打印“110”示意

03

一个简单的程序

上面的例子比较简单,我们再来看一个稍微复杂点的例子。我们利用图灵机的设计思路设计一个可以执行“状态反转”的程序,即将前面打印在纸带上的“110”每个位上的二进制取反变成“001”。

这个时候我们需要预先定义一个指令集,也就是当图灵机上的探头读到方格内的内容时可以查这个指令集,然后将读取到的内容和指令集进行比对,根据指令集上的指示来进行下一步的操作。我们将这个简单程序的指令集定义为下表所示。

表1 指令集表

那我们看一下图灵机如何实现这个“状态反转”的小程序。如图2,探头读到的格子里的值是“0”,再查上面的表1的第2行,知道当读到“0”时,探头在格子里写入“1”,然后右移一格。

图3 探头读到“0”后的操作

此时,探头读到“1”,通过查指令集表 31,探头写入“0”,然后右移。如图4.

图4 探头读到“1”后的操作

上一步操作之后,探头再次在格子中读到“1”,再次查指令集表1,探头写入“0”然后右移。如图5.

图5 探头又读到“1”后的操作

经过上一步的右移之后,此时探头读到的格子里面的内容是空,通过读指令集表 31知道,探头不向格子中写入值,纸带也不移动。至此,图灵机就把“110”改写成了“001”。

机器状态:上面程序的指令集是不完整的,因为到最后探头不右移纸带也不改变格子里的值,但它还在不停的读取格子里的值然后查表。这个机器会一直重复执行命令,它并不知道何时停止执行。我们还需要引入一个机器状态(Machine State)的概念。我们给表 1增加一列。

表2 插入机器状态后的指令集

有了机器状态列的表 2,在上一小节中最后探头读到一个空的格子后,就会停止。

如果我们把方格里面的状态从“1”、“0”、“空”三种继续增加,而相对应的指令集表 32的行数也会跟着增加。这样的话,我们的图灵机就可以通过简单的读单元格、查指令集表、改变单元格状态、移动纸带这些非常简单、基本的操作来进行非常复杂的数学运算了

我们现在使用的各种计算机、嵌入式系统等虽然看似复杂,但在本质上也还是对图灵机的进化而已。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 讲编程的高老师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
有趣的 Python 特性 3 | 当心「默认可变参数」这个大猪蹄子。
Python 提供了很多让使用者觉得舒服至极的功能特性,但是随着不断的深入学习和使用 Python,我发现其中存在着许多玄学的输出与之前预想的结果大相径庭,这个对于初学者来说难以理解,但是在理解它们以后又会觉得是这么的有意思,所以我准备了这个「有趣的 Python 特性」系列,写一些我碰到或看到的一些你所不知道的「奇葩」,这里面会涉及到在 Python2 和 Python3 中的异同,希望大家能从学习的过程中体会到真正的乐趣。
编程文青李狗蛋
2019/11/07
2790
10分钟学会 Python 函数基础知识
简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用。
马哥linux运维
2019/04/25
7410
python基础—函数参数
注意:  最后一个参数的顺序是错误的,因为可变的位置参数,是不能放在关键字参数后面的,否则会出错。
dogfei
2020/07/31
3340
Python编程思想(19):可变参数也可以这样玩
很多编程语言都允许定义个数可变的参数,这样可以在调用函数时传入任意多个参数。Python当然也不例外,Python允许在形参前面添加一个星号(*),这样就意味着该参数可接收多个参数值,多个参数值被当成元组传入。下面程序定义了一个形参个数可变的函数。
蒙娜丽宁
2020/06/17
5190
Python函数签名的参数设计以及=None的重要性
位置参数(Positional Arguments):最常见的参数类型,按照位置传递。
运维开发王义杰
2023/09/19
5740
Python函数签名的参数设计以及=None的重要性
week04_python函数、参数及参数
        由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元;
py3study
2020/01/14
5530
关于C++ const 的全面总结
C++中的const关键字的使用方法很灵活,而使用const将大大改善程序的健壮性,本人依据各方面查到的资料进行总结例如以下,期望对朋友们有所帮助。
全栈程序员站长
2022/07/14
1.5K0
【译】golang 可变参数函数终极指南
Ultimate Guide to Go Variadic Functions 原文地址 https://blog.learngoprogramming.com/golang-variadic-funcs-how-to-patterns-369408f19085
goodspeed
2020/12/22
3.5K0
【译】golang 可变参数函数终极指南
Python函数详解一(函数参数、变量作用域)
函数的返回值用return语句返回,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
吾非同
2020/10/26
1.1K0
Python函数详解一(函数参数、变量作用域)
2.GO-可变参数函数,匿名函数和函数变量
2.1.可变参数函数 可变参数指参数的个数可以是任意个 可变参数必须在参数列表最后的位置,在参数名和类型之间添加三个点表示可变参数函数 声明函数时,在函数体把可变参数当作切片使用即可 package main import "fmt" func demo(name string, hover ... string) { fmt.Println(name,"的爱好是") for i,n := range hover{ fmt.Println(i,n) } } func main() {
zhang_derek
2019/08/06
8340
你所不知道的Python | 函数参数的演进之路
函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的代码,也能处理复杂的调用。
simpleapples
2018/10/18
4750
[949]python不定长参数*args和**kwargs
在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:
周小董
2021/03/08
3.7K1
整理C/C++的可变参数
c语言中使用可变参数最熟悉应该就是printf, 其是通过...来从代码语句中表示可变化的参数表。
Rock_Lee
2020/09/21
5.7K0
Python 函数 —— 定义,参数,参
    数学定义:y = f(x), y是x的函数,x是自变量。 y = f(x0,x1,x2,...,xn)
py3study
2020/01/10
1.2K0
PHP进阶-默认参数值和可变参数列表
PHP函数支持默认参数值和可变参数列表两种特性。默认参数值,即可以为参数指定默认值,使得在函数调用时如果没有提供相应参数,则会使用默认值;可变参数列表,即使用不定数量的参数调用函数。本文将详细介绍这两种用法,并通过代码举例说明其使用场景。熟练掌握默认参数和可变参数列表的使用,可以极大地提高PHP开发的效率。
Damon小智
2024/02/03
2991
基于stdarg.h的可变参数函数的用法
在开始学习C语言的函数的时候,我们就知道函数的参数个数应该是在函数声明的时候就指定的,这一点我们没有任何疑问。但是不知道大家有没有注意到我们的printf()函数,他的函数参数理论上并不是确定的,而是随着匹配字符串中的格式控制符的个数控制的。其实当时也没有注意到这一点,到是最近,偶然间看到了《嗨翻C语言》这本书,这里就详细讲解了这种可变参数函数的实现原理,今天考试间隙就顺带学习了一下,其实就是一种方法,知道了就晓得了,也是非常的简单。
mythsman
2022/11/14
6430
软件测试|Python函数参数之必传参数、默认参数、可变参数、关键字参数的详细使用
在Python中,函数参数是定义在函数头部的变量,用于接收传递给函数的数据。Python函数参数有四种类型:必传参数、默认参数、可变参数和关键字参数。每种类型都有不同的使用方式和适用场景。本文将详细介绍这四种函数参数的使用方法。
霍格沃兹测试开发Muller老师
2023/10/13
6950
【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
参数入栈问题 : 函数参数的计算次序是不固定的, 严重依赖于编译器的实现, 编译器中函数参数入栈次序;
韩曙亮
2023/03/27
1.3K0
【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
Python中函数的介绍
函数名:函数名是函数的标识符,用于唯一标识函数。在定义函数时,需要给函数一个名字,以便后续调用和引用。函数名应遵循命名规则,例如以字母或下划线开头,由字母、数字或下划线组成。命名规范可参考官网的PEP 8风格,地址如下:
小博测试成长之路
2023/09/01
2720
Python中函数的介绍
C/C++开发基础——可变参数与可变参数模板
1.如果可变参数的参数类型相同,可以使用标准库中的initializer_list。
Coder-ZZ
2023/09/04
8000
C/C++开发基础——可变参数与可变参数模板
推荐阅读
相关推荐
有趣的 Python 特性 3 | 当心「默认可变参数」这个大猪蹄子。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档