这个 (max) 函数如何使用 while 循环工作?

how does this (max) function work using while loop?

我有一个家庭作业是使用 java 中的函数来获得一组 3 个数字中的最大数字,这就是我想出的:

public static int max(int b, int a ,int d) {
    int o =0;
    while (b!=0 && a!=0 && d!=0)
    {
        b++;
        a++;
        d++;
        o--;
    }
    return o;
}

问题是如果给它 3 个数字它会起作用,但我不明白它是如何起作用的。

好的,所以它正在做的是增加所有三个变量 bad,直到其中任何一个等于零。它会记录循环次数 o(即任何变量达到零所需的迭代次数),负数除外。

如果bad是负数,那么它们会相对较快地接近0,而o会是负数-但这不是正在发生的事情,是吗?您输入的是正数,得到的是正数。

那是因为这个解决方案依赖于整数溢出。当 bad 达到整数最大值 2147483647 时,它返回到 -2147483648,并继续向零计数。同时,o 在相反的方向做同样的事情,包裹另一个方向。数学计算表明,当 bad 达到零时,o 达到 b、[=12= 的精确值],或 d 开始于。

(对于负数,收敛速度要快得多 - 但如果您将负数和正数都放入此函数中,您可能会感到震惊。它会告诉您负数更大比正数!)


现在您了解了它是如何工作的,您也了解了为什么这是一个对这个问题的糟糕解决方案。它将 运行 比需要的 长得多以获得结果(除非输入为负,在这种情况下它只会 运行比必要的时间长一点)。

更合理的常识性实现应该是这样的:

public static int max(int b, int a ,int d) {
    if (a >= b && a >= d) {
        return a;
    } else if (b >= a && b >= d) {
        return b;
    } else {
        return d;
    }
}

最多包含 四个 操作,无论 abd 有多大。

假设 bad 整数为正数,while 循环将 运行 理论上永远或实际上直到您遇到错误。返回 o 什么都不做,它只是一个非常小的负数,它不会告诉你这三个数字中哪个是最大的,只会告诉你在程序失败之前执行了多少次迭代。

最好将它们添加到某个数组中,对它们进行排序并且 return 最高。你甚至可以为 N 个数字做这件事,而不仅仅是三个。

private static int max(int... numbers){
    return Collections.max(Arrays.asList(numbers));
}

其中 Arrays.asList(numbers) 从输入中生成 ListCollections::max 将在列表中找到最大的数字。

因此您可以调用 max(3, 4, 5, 6, 7, 8, 8, 9)max(1, 2)

或者,如果您需要在没有任何库的情况下执行此操作,即使它们是原生的,那么只需使用一组 if 语句即可。

public static int max(int a, int b, int c) {
    if (a >= b && a >= c) {
        return a;
    } else if (b >= a && b >= c) {
        return b;
    } else {
        return c;
    }
}

但这比使用以前的解决方案更难阅读和理解,后者清楚地告诉您发生了什么,而无需考虑三重 if 语句。

还假设输入参数为 int b, int a ,int d,拼写为

B A D

我敢打赌这不是你的答案,而是一个你应该修正的如何不去做的例子。