对于集合中的不同值,此算法(pseudeocode)是否会终止?
while (curElement != average(allElements))
{
curElement = average(allElements);
nextElement();
}
请注意,我假设如果我们在数组的末尾,我们将从头开始重新开始。
答案 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;
会不会终止?这实际上取决于实施。