文章目录

  • 从最大公约数讲起
  • 停机问题的一种证明方式
  • 写在后面
  • 参考资料

从最大公约数讲起

如果要计算90和21的最大公约数,根据欧几里德的定理,等同于求21和6的最大公约数,进一步等同于求6和3的最大公约数,经过几步转化,最终我们得到了结果:3。

这样一系列“有限”的步骤的集合,我们称之为算法。假设我们把求最大公约数算法的名字就叫做GCD,当我们说GCD作用于90和21可以停机的时候,转成大白话就是:GCD(90, 21)不会陷入死循环,并且返回值是3。事实上,GCD对于“任何合法”的输入总是能停机的。

那么可不可以进一步问:有没有这样一个算法,对于任意一个给定的程序和输入,可以判断出这个程序是否会停机[1]

停机问题的一种证明方式

假设我们有一个程序,就叫will-stop?,它可以针对任意的程序algorithm和输入input,返回是否可以停机,写成伪代码就是:

bool will-stop?(algorithm, input) {// return true or false
}

接着我们来设计一个叫evil的程序,它接受一个程序algorithm,在内部,它调用will-stop?并根据返回做一个相反的动作。写成伪代码也就是:

void evil(algorithm) {if (will-stop?(algorithm, algorithm)) {// 当返回true,就进行一个不能停机的死循环while(true)} else {// 当返回false,就立即执行一个停机动作return}
}

接下来我们尝试用will-stop?来判断一下evil(evil)这个函数调用是否会停机。也就是:will-stop?(evil, evil)输出的到底是什么?为了方便表述,我们同时也用evil1和evil2指代上面的evil,也就是说evil、evil1、evil2 这3者是等价的。

下面我们用will-stop?(evil1, evil2)代替之前的will-stop?(evil, evil)。

  • 假设evil1(evil2)能停机,也就是will-stop?(evil1, evil2)返回的是true,我们把evil2代入到evil1的函数体中,也就说evil1内部的will-stop?(evil2, evil2)返回的是false,也就是说它告诉我们evil2(evil2)不会停机。但是,别忘了evil1(evil2)和evil2(evil2)代表的其实都是evil(evil),所以will-stop?的结果自相矛盾了。

  • 那么,反过来呢?假设evil1(evil2)不能停机,则evil1内部的will-stop?(evil2, evil2)必然返回true,也就是说它告诉我们evil2(evil2)停机了。依然还是自相矛盾。

也就是说,无论怎么假设都无法让内部和外部的will-stop?达成一致。因此,我们说,不存在这样一个算法,对于任意一个给定的程序和输入,都可以判定出该程序是否会停机。也就是说,停机问题是不可判定的。

写在后面

证明的部分我参考了Daniel Friedman[2]以及刘未鹏[3]的实现。同时,做了一些表述上的优化,并补充了一些背景知识[4],使它看起来不像是一个冷冰冰的数学问题。

参考资料

[1] Halting problem
[2] 《The Little Schemer - 4th Edition》
[3] 康托尔、哥德尔、图灵——永恒的金色对角线(rev#2)
[4] 《计算进化史:改变数学的命运》

关于停机问题的一点思考相关推荐

  1. mysql 手动写时间_关于数据库中如何存储时间的一点思考

    1.切记不要用字符串存储日期 我记得我在大学的时候就这样干过,而且现在很多对数据库不太了解的新手也会这样干,可见,这种存储日期的方式的优点还是有的,就是简单直白,容易上手. 但是,这是不正确的做法,主 ...

  2. 对于表列数据类型选择的一点思考

    对于表列数据类型选择的一点思考 简介 SQL Server每个表中各列的数据类型的选择通常显得很简单,但是对于具体数据类型的选择的不同对性能的影响还是略有差别.本篇文章对SQL Server表列数据类 ...

  3. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  4. 对高并发流量控制的一点思考

    前言 在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,本篇博客的话题主要就是自己对高并发流量控制的一点思考. 应对大流量的一些思路 首先,我们来说一下什 ...

  5. 关于c语言结构体偏移的一点思考

    注:此处只是利用了编译器的特性来计算结构体偏移 这句话就一笔带过,说得有点牵强附会.以后有时间自己再详细了解一下编译器的特性... more exceptional c++ 中文版 26页 https ...

  6. App用户体验的一点思考

    App用户体验的一点思考 最近我在团队中负责TImers4Me这款Android软件的开发.维护和更新,软件每次在市场上的发布都能得到用户一些有价值的反馈,通过收集整理用户们的使用反馈,我们常能看到一 ...

  7. 对高并发流量控制的一点思考 推荐

    前言 在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,本篇博客的话题主要就是自己对高并发流量控制的一点思考. 应对大流量的一些思路 首先,我们来说一下什 ...

  8. 贝特朗奇论 用计算机,关于贝特朗奇论的一点思考

    关于贝特朗奇论的一点思考 贝特朗奇论这个名字就很奇怪,我最开始以为是贝特朗奇的某个论点或者命题,但是百度了一下发现原来是贝特朗(Bertrand)的"奇论",最初用以批判当时尚不严 ...

  9. 对产品质量的一点思考

    不管是做产品还是做项目,也不管是采用瀑布模型还是敏捷开发,我们都有一个终极目标,就是能按时交付质量可靠的功能,其中质量尤为重要. 本文是我对产品质量的一点思考,如果您所在的团队代码质量很高,很少出BU ...

最新文章

  1. 再次认识 vertical-align
  2. C#游戏开发快速入门教程Unity5.5教程
  3. Docker桌面不再对企业用户免费,每月订阅费最高21美元,用户直接炸锅了
  4. OpenCV 对图片亮度增强或减弱
  5. IIC原理及简单流程
  6. ABAP Access global variable in another program
  7. Oracle rman备份和还原恢复数据库
  8. ubuntu start
  9. [转]天天生鲜,html效果布局
  10. HTTPBrowserCapabilities---在asp.net中显示浏览器属性
  11. OUC_Summer Training_ DIV2_#11 722
  12. Julia: map、匿名函数和“差之毫厘,谬之千里”
  13. STM32 Futaba SBUS协议解析
  14. forge是用java装吗_我的世界forge怎么安装 forge使用方法
  15. D. Three Religions
  16. 上市公司创新研发支出数据(2006-2018年)
  17. 腾讯音乐路演PPT曝光:发行区间13至15美元 下周上市
  18. 兰州交通大学php,航拍兰州交通大学校园∣让我再看你一遍 从南到北
  19. 微信公众号如何添加文档附件【教程】
  20. Android 项目接入网易云信IM单聊,群聊

热门文章

  1. 大一计算机知识总结,大一大学计算机基础课程知识点汇总.doc
  2. fine tune openAI model ( 微调chatgpt)
  3. YARN 在快手的应用实践与技术演进之路
  4. 一辆学校班车里面能装多少个高尔夫球 Google 谷歌 百度 baidu 阿里巴巴 alibaba 微软 华为 hu
  5. iperf+natapp做4g模块网络带宽测试
  6. 安装软件出现错误代码0x8007007e
  7. [转]解构推荐系统:“猜你喜欢”是怎么猜中你的心思
  8. smali语言详解之类的声明
  9. phpcms V9 整合 Discuz! X2 标准教程
  10. matlab 中图的大小_MATLAB画图之自定义图片大小