【问题标题】:how does this (max) function work using while loop?这个(max)函数如何使用while循环工作?
【发布时间】:2021-12-26 18:51:10
【问题描述】:

我有一个作业要使用 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 个数字,它会起作用,但我不明白它是如何工作的。

【问题讨论】:

  • 所以,你想出了它,但现在你不知道它是如何工作的?
  • 是的,在我在 (max) 之前所做的 (min) 函数中,我所做的只是翻转 (b,a,d to -- 和 o to++),当我在最大的工作,但我需要了解它是如何工作的。
  • 您依赖整数下溢。对于 (1,2,3),您一直迭代到负 20 亿,然后下溢回到 +20 亿,然后再次迭代回到 3。
  • 我想知道b-a-d 作为变量名,而不是a-b-c,是故意的。您是否可能搜索过“效率最低的最大数函数”? :)
  • 哈哈,这是作业的一部分,a-b-c 被拿走了

标签: java function max min


【解决方案1】:

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

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

这是因为这个解决方案依赖于整数溢出。当bad 达到整数最大值 2147483647 时,它会回绕到 -2147483648,并继续朝零计数。同时,o 在相反的方向做同样的事情,包裹另一个方向。计算结果是,当bad 达到零时,o 达到bad 开始的确切值。

(对于负数,收敛速度要快得多——但是如果你在这个函数中同时输入一个负数和一个正数,你可能会感到震惊。它会告诉你负数大于正数!)


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

更合理的常识实现如下所示:

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 有多大。

【讨论】:

  • 或者静态导入Math.max:max(max(a, b), c)
  • 这就是我想的可能发生的事情,不知道它叫整数溢出谢谢老兄。
【解决方案2】:

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

最好将它们添加到某个数组中,对它们进行排序并返回最高值。你甚至可以为 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

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

【讨论】:

  • 循环不会永远运行,也不会出错 - 在 Java 中,整数只会溢出/下溢而没有任何错误:Integer.MAX_VALUE + 1 导致 Integer.MIN_VALUE,即 2147483647 + 1 == -2147483648 -基于此,如果所有数字都是正数,则代码工作(非常慢)
  • 正确,我不在乎,但出于与声誉不同的原因。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2022-10-07
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多