如何检查程序是否终止?

时间:2010-09-26 06:14:34

标签: algorithm termination

是否有可用于确定此问题的一般规则? E.g:

int i = 10;
while (i > 1 ) {
  if (i%2 == 0) i = i/2;
  else i = 3*i - 1;
}

4 个答案:

答案 0 :(得分:13)

这是halting problem。没有能够做你所要求的算法。

特别是,如果有这样的算法,那么与你问题中的函数相关的collatz conjecture将是微不足道的(或者至少要容易得多)。

答案 1 :(得分:1)

你可能指的是停止问题。简而言之,没有通用的方法来确定程序是否会停止。查看this article

答案 2 :(得分:1)

一般来说,“不”。正如其他人已经说过的那样,通过您的具体示例,可以证明不会终止,因为如果i是偶数(或i是非正面的,i只会更小;奇怪,但考虑到初始条件,这将永远不会发生)。最小的正偶数是2,然后在下一次迭代时变为1,然后它将变为2。

有趣的是,你没有检查Collat​​z猜想,因为你正在迭代“如果偶数则减半,3 * n-1如果奇数”并且Collat​​z猜想迭代“如果偶数则减半,3 * n + 1如果奇数”。我无法通过快速搜索找到这个序列。

答案 3 :(得分:0)

termination analysis 有几种方法可以证明程序是否将停止。在图灵完备的编程语言中并不总是能够做到这一点,但是有几种total functional programming languages仅限于可证明停止的程序。