停机问题
如果存在这样的算法就太完美了。
定义
停机问题(英语:halting problem)是逻辑数学中可计算性理论的一个问题。通俗地说,停机问题就是判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。
—— 维基百科
程序为什么会不停机呢?程序有三种结构 —— 顺序结构,条件结构,循环结构。
如果程序只允许使用顺序结构和条件结构,而且代码行数是有限的,那么程序一定会停机。
但如果使用了循环结构(包括递归,goto
和 continuation
等),就有可能陷入死循环。因为可能由于边界检查不严等原因导致无限递归或者无限循环。
停机问题找寻的是一种通用的算法。如果是一段具体的代码还是可以判断出是否停机的。
理发师
如果一个人不给自己理发,那么理发师就给他理发。
如果一个人自己理发,那么理发师就不给他理发。
那么理发师给不给自己理发?
如果理发师给自己理发,那么按照一个人自己理发的原则,理发师就不应该给这个人理发。
如果理发师不给自己理发,那么按照一个人不给自己理发的原则,理发师应该给自己理发。
本质上这是一阶逻辑自我指涉的不自洽性。
证明
停机问题的证明类似理发师悖论。
如果存在一个判断程序是否停机的算法,停机的时候返回 1 ,不停机返回 0 。
那么构造一个相反的算法,停机的时候返回 0 ,不停机的是否返回 1 。
如果用停机算法判断这个相反的算法结果会是怎样。
如果结果是停机,根据停机算法的定义得出相反的算法会停机。但是这跟相反算法的定义矛盾。相反算法定义为与停机算法结果相反。停机算法结果是停机,那么相反算法会不停机。
如果结果是不停机,根据停机算法的定义得出相反的算法不停机。但是这跟相反算法的定义矛盾。相反算法定义为与停机算法结果相反。停机算法的结果是不停机,那么相反算法会停机。
所以不存在通用的停机检测算法。