这个算法会终止吗?

时间:2012-02-10 09:45:29

标签: algorithm language-agnostic infinite-loop halting-problem

对于集合中的不同值,此算法(pseudeocode)是否会终止?

while (curElement != average(allElements))
{
    curElement = average(allElements);
    nextElement();
}

请注意,我假设如果我们在数组的末尾,我们将从头开始重新开始。

2 个答案:

答案 0 :(得分:5)

由于这是伪代码,一个带有2个元素的简单示例将揭示有些程序不会终止的情况:

x = 0, y = 1;

          x     y
Step 1:   0.5   1
Step 2:   0.5   0.75
Step 3:   0.635 0.75
//and so one

涉及一些数学,lim(x-y) = lim( 1 / 2^n )

所以数字会收敛,但它们永远不会相等。

但是,如果您实际在计算机上实现这一点,由于硬件限制,它们会变得相同 - 并非所有数字都可以用有限的位数表示。

答案 1 :(得分:2)

取决于。

如果你的元素包含离散值,那么很可能它们会在几次运行后落入相同的值。

如果你的元素具有有限的精度值(例如浮点数或双精度数),则需要更长的时间,但时间有限。

如果您的元素包含任意精度值,那么您的算法可能永远不会完成。 (如果你把每一块积分计算在一起并将它加到一张纸上,你需要无限的时间,一张无限大的纸,以及对这个类比的无限耐心。)

您的代码与以下内容之间几乎没有区别:

var i = 1;
while (i != 0) 
    i = i / 2;

会不会终止?这实际上取决于实施。