在一个集合中有不同的值,这个伪代码算法会终止吗?
while (curElement != average(allElements))
{
curElement = average(allElements);
nextElement();
}
请注意,我假设如果我们处于数组的末尾,我们将从开头重新开始。
在一个集合中有不同的值,这个伪代码算法会终止吗?
while (curElement != average(allElements))
{
curElement = average(allElements);
nextElement();
}
这是伪代码,一个包含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 )
所以这些数字收敛,但永远不会相等。
然而,如果你在计算机上实现它,由于硬件限制,它们将变得相等 - 并非所有数字都能用有限数量的位表示。
这要看情况。
如果您的元素保存的是离散值,那么它们很可能在几次运行后会落入相同的值。
如果您的元素保存的是有限精度值(例如浮点数或双精度浮点数),那么需要更长的时间,但仍然是有限的。
如果您的元素保存的是任意精度值,那么您的算法可能永远无法完成。(如果您将整数的每一部分加起来并将其添加到纸上的数字中,则需要无限的时间、无限大的纸张和对这个类比的无限耐心。)
您的代码与以下代码之间几乎没有区别:
var i = 1;
while (i != 0)
i = i / 2;
它是否会终止?这主要取决于实现方式。
average(allElements)
的? - Fahim ParkarcurElement = nextElement()
[打字错误?],否则 - 答案是微不足道的:如果你只进入循环一次 - 你会立即退出,因为 currElement 被定义为平均值。 - amit