文章目录

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

从最大公约数讲起

如果要计算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. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)
  2. 零售业如何用Hadoop开启大数据之门?
  3. C++ string类型与数值型变量的相互转换
  4. Power of Cryptography
  5. SAP SD-销售模式-寄售(客户寄售)
  6. c++强制类型转换运算符
  7. tcp 三次握手,四次挥手
  8. 创建自己的Convers. Routine.
  9. BZOJ 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)
  10. LeetCode:64. 最小路径和(python、c++)
  11. 关于IDE集成开发环境,Pycharm小技巧
  12. DirectX8编程指南-1 (转)
  13. Hadoop集群配置(二)免密登录和集群配置
  14. 关于RGB888和RGB565互转代码实现方案推荐
  15. excel导出时报错 “文件格式和扩展名不匹配,文件可能已损坏或不安全”解决办法
  16. mysql中rpl_MySQL半同步复制之rpl_semi_sync_master_wait_point
  17. Java学习day096 并发(六)(线程安全的集合:高效的映射、集和队列、映射条目的原子更新、对并发散列映射的批操作、并发集视图、写数组的拷贝、并行数组算法、较早的线程安全集合)
  18. python 游戏(记忆拼图Memory_Puzzle)
  19. 生日悖论与Hash函数的攻击
  20. 如何把 html、js、css 等一个 html 网页打包成单一的 exe 可执行程序文件?

热门文章

  1. Python基础之Scrapy进阶
  2. 证件照制作v2.9.37
  3. 网络定向爬虫实例---淘宝商品信息比价
  4. CSS :hover闪烁问题
  5. 详解JavaScript(ECMAScript与DOM)
  6. 如何在没有软件的情况下将 PDF 转换为 PPT(100% 免费)
  7. 软件使用 | Pycharm使用技巧大全
  8. leetcode 309:最佳买卖股票时机含解冻期
  9. Android自动发送短信
  10. html图片展示插件,12款经典的白富美型—jquery图片轮播插件—前端开发必备