停机问题与考拉兹猜想:循环何时终止
透明循环,它们总是易于预测。这类循环具有清晰的递减规律,它始终朝着一个终止点前进。你只需阅读代码就能“看到”它们的结束。你可以看到 i 不断缩小,最终会达到 0。我们称之为良基循环,它必然会停止,因为某个有限的值在倒计时。
i = 10while i > 0:i = i - 1另一个例子,你知道循环会执行多少步,因为范围是有限的。所以循环会终止,这一点很容易证明。
for n in range(1, 100):print(n)条件循环,仍然可预测,但更复杂。现在,循环依赖于一个不太明显但仍然可以分析的条件。你可以推断:x 每次都会翻倍,经过有限步后,x < 100 将变为假。循环会终止,但你需要稍微思考一下。
x = 1while x < 100:x = 2 * x另一个例子,这里,我们知道每个整数最终都会变成一个完全平方数,所以循环会终止,但我们的推理现在涉及到数字的数学性质。
while n is not a perfect square:n = n + 1不确定的中间部分,难以预测。现在我们进入循环的讨论,这类循环的终止取决于更深层次的性质,这些性质并非总是可判定的。
这就是著名的考拉兹猜想(Collatz conjecture)。对于我们测试过的每一个数字,循环最终都会到达 1,但没有人证明它总是如此。因此,我们无法确定它是否会对所有输入都终止。你可以无限地模拟它,但你无法知道是否存在某个数字会导致无限循环。
def collatz(n):while n != 1:if n % 2 == 0:n = n / 2else:n = 3 * n + 1自指或无限搜索处于不可知的边缘。现在我们来讨论一般来说在数学上不可判定的循环。
mystery():while HALTS(this_program):pass或者更简单地说,这里,程序是否停止取决于一些无法在不解决另一个开放式或自指问题的情况下计算出来的东西,它可能会永远运行下去,因为它在寻找一个不存在的答案。这就是停机问题的难点所在:你无法在不真正无限运行的情况下判断它是否会停止。
while not proof_found:search_for_proof()倒计时的循环具有很强的确定性,因此是有限的过程。条件由简单的数学公式决定的循环是概率性的,也易于建模。复杂的数学模式,例如考拉兹定理,这样的循环是未知性,依赖于未经证实的真理。自指或无限搜索,具有不可判定性,无法进行一般性预测。
