停机问题
用数学走进程序员的生活
逝者如斯夫,不舍昼夜 —— 《子罕》
程序员的一次编码
在以前,由于电脑的性能问题,经常会出现程序不断运行但是不输出结果的情形。有的时候是由于电脑运行过慢,有的时候是电脑内存不够,有的时候单纯是自己写出了死循环。
作为一个程序员,从来不希望自己的代码无止境的运行下去。因为这很可能意味着我们得不到计算的结果,可能代表着服务器的崩塌,可能意味着永远找不到对象。
最让人头疼的应该是在等待的过程中吧,很可能下一毫秒就能运行出正确结果,但是我们失去了耐心,手欠终止了程序,很可能再也不能正确地写出程序,因为我们会忙着改变这个「错误」的代码。
![699ce03b748ab595929dabc293b5bd6f.png](https://i-blog.csdnimg.cn/blog_migrate/61221403a43445d16463eb38437b3f88.png)
我在上大一的第一门COMP课时,教授是Rocky。他有个程序跑得非常慢,我们都以为他翻车了,结果这时一个macBook Pro完美运行了出来(坚定了我转Apple的决心)。
所以,不只是我,所有的程序员都有一个问题,是否存在一个程序能够检测所有的代码,并在有限的时间内判断出来它会终止,还是会无止境的运行下去。
停机问题
好了,你可能要问这个问题有什么用,很多时候人们用眼睛就能区别那些能无止境运行,那些肯定会终止,比如下面这个程序
初始
判是否大于是则终止,否则执行
让为,然后执行
不需要超凡的才能,就能知道,
若, 那么这个程序将会无休无止地运行下去。
相反,若那么程序在第一次运行到第二步时就会终止。
所以说很多时候人也能通过简单的计算来分别自己是否写了死循环。但是我马上就能让你觉得这个能判断程序是否终止的程序,是一个有重要价值的事情。
数学有一道难题叫哥德巴赫猜想: 任何大于的偶数,都能表示为两个素数的和
![0060b4c06e0543d9257c0a85c5fb6158.png](https://i-blog.csdnimg.cn/blog_migrate/e78fa01dccd94b8c8b9dff21c940eab7.png)
这个程序很容易写出来(欢迎读者订阅本公众号,会教你用计算机语言写个出来)。然后我们用这个判断程序来考察这个哥德巴赫猜想程序。如果说这个程序能终止,那我们就推翻哥德巴赫猜想;要是无止境地运行,我们就能证明哥德巴赫猜想是对的。
还有好多数学界的难题,只要是离散的,我们都可以用这个程序解决。我们可以设计一个人类人口模型,判断人类是否能无止境的存在在这个世界上。随着科技的发展,我们可以输入足够的数据,来设计一个程序考察这个宇宙能否无尽的存活下去。所有的问题我们都可以来这么解决。
![b713a76e310aa0be8395193bd3ac0ca4.png](https://i-blog.csdnimg.cn/blog_migrate/5653d38145a87b5205f21c4667d49a1c.png)
那么我们能设计一个这样的程序吗?那样我们可就是人类的功臣了。
答案是不可能
我可能设计不出来,但我能证明任何人都设计不出来。(A型多巴胺也不行,我说的)
假设我们有一台完美的机器,它有无限大的内存,能表示无穷精度的数,比如下面这个哥们,它可能仅仅存在我们的想象中,但事实上,很多超级计算机,运行速度已经超过了我们的想象,所以这个假设是合理的。这样,我们先排除因为计算机内存问题的终断。
我们用归谬法,假设存在这样一个程序,然后找到矛盾。
假设这个程序叫
它输入代码段a,还有代码段的环境变量b(换句话说就是程序a的输入)。它能判断 的运行情况,- 要是无止尽,就输出无止尽;
- 要是能停止,就输出终止。
那我们偏偏要搞这个程序的心态。
我们要构造一个程序, 它输入一个数据。然后调用 , 要是
- 输出无止尽,就立即终止;
- 输出终止,就执行一个死循环,比如之前那个, 令.
现在我们调用
,也就是把 自己输过去。那么在里边 就会判断, 。也就是 以自己( )作为输入,其结果如何。- 要是输出无止境的运行,那么就会立即终止。
- 要是输出终止,那么就会执行死循环。
是什么意思?意思是程序以代码为输入的运行结果究竟是死循环还是终止。我们看一下这个,正好就是以为输入的过程。然而,的判断和事实背道而驰,所以它不能预测的未来。
因此,这样一个并不能存在。证毕。
总结
这个证明撕碎了我们企图成为人类主宰的梦想。但是也告诉我们,很多时候,人类的想象力是有限的。因为人们对计算能力的思考,天生就被限制在语言的范围。这也侧面证明了
程序员的力量是有限的
踏踏实实工作,才是生活真谛。
你遇到过最惨的电脑问题是什么呢?只要够惨,就快点来分享吧。
关注泡梨C院,更多干货趣闻搞起来熬。
![0d0848a005f12651c80510a456bd39a0.png](https://i-blog.csdnimg.cn/blog_migrate/9decf0529eaf11d4af6a8bfbaf65ce10.jpeg)
(图片源于网络,如有侵权,请告知删除)