JS中与Infinity的比较如何找到最大的数字?

时间:2017-09-25 21:35:06

标签: javascript

原谅我的困惑......我正在浏览整个W3School的JS作为快速参考,以面向所有JS ......

遇到这个代码,虽然我理解它的机制,但我不明白它是如何工作的,即找到最大的数字。

通过与负无穷大比较,找到最大数字的工作原理会有什么帮助?

代码:(link of where it came from

<!DOCTYPE html>
<html>
<body>

<p>Finding the largest number.</p>
<p id="demo"></p>

<script>
function findMax() {
    var i;
    var max = -Infinity;
    for(i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
    }
    return max;
} 
document.getElementById("demo").innerHTML = findMax(4, 5, 6);
</script>

</body>
</html>

5 个答案:

答案 0 :(得分:1)

  

通过与负无穷大比较,找到最大数字的工作原理会有什么帮助?

此处的代码并不总是与否定Infinity进行比较:

var max = -Infinity;

但是它只是将max变量初始化为-Infinity,因此它保证当我们循环数组值时,不会有任何低于它的值。< / p>

<强>分析:

例如,当我们调用findMax(4, 5, 6)时,我们将进行三次迭代:

  1. 在第一次迭代中,if(arguments[0] > max)&lt; ==&gt; 4>-Infinitytrue max=4
  2. 在第二次迭代中,if(arguments[1] > max)&lt; ==&gt; 5>4true max=5
  3. 在第三次迭代中,if(arguments[2] > max)&lt; ==&gt; 6>5true max=6
  4. <强>结论:

    因此,您可以在此处看到max值将始终使用array中的第一个元素进行更新,因为任何传递的数字都将高于-Infinity,即使我们传递了负值例如-1240000-9999999或-102457933210 they will always be higher than - Infinity`。

答案 1 :(得分:1)

-Infinity<运算符的中性元素。

这意味着:

-∞ > T = false for every T

如果您从-∞开始循环,则始终将第一个元素设为maximum

如果您想使用链(其数学等价于循环)找到maximum

s1 = max of e1,e2
s2 = max of s1,e3
s3 = max of s2,e4
...

您可以重写为:

s1 = max of e1,-∞
s2 = max of s1,e2
s3 = max of s2,e3
...

此处s1 = e1

答案 2 :(得分:0)

function findMax() {
    console.log(arguments)
    var i;
    var max = -Infinity;
    for(i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
        console.log(i, max);
    }
    return max;
}


console.log(findMax(1, 2, 3, 4));

如您所见,(1, 2, 3, 4)在数组[arguments]中传递。在每次迭代时,arguments[i] > max然后max = arguments[i]

  

注意 - 无穷大是最小的数字,因此最初的max将初始化为-Infinity

答案 3 :(得分:0)

该示例使用-Infinity作为开始比较的绝对最小数字。所以,例如,如果你传递了所有负数,并且它们都是相对较大的负数,那么你的最大函数就可以工作。

e.g。 findMax(-123456, -123459, -1234832383483)

在这个例子中,它是一个很好的初始值,而不是零。在这种情况下,零将是findMax的结果,因为前一个示例中的所有数字都小于零。

答案 4 :(得分:0)

当您尝试确定如何执行此操作时,答案可能会变得清晰。这是另一个候选解决方案:

function findMax() {
    var i;
    var max = arguments[0];
    for (i = 1; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
    }
    return max;
} 

这个似乎更简单。你不需要一个初始值,取而代之的是参数的第一个值。

似乎有效:

findMax(8, 6, 7, 5, 3, 0, 9, 8, 6, 7, 5); //=> 9

即使您只提供一个值,它仍然有效:

findMax(42); //=> 42

你能看到失败的地方吗?这种实现存在严重问题。

你找到了吗?

findMax(); //=> undefined

当你传递它时根本没有参数,你得到undefined,这是一个非数字结果。

使用其他版本,它将返回-Infinity。这个答案有一个数字类型;所以函数总是返回一个数字。具有一致的返回类型使得使用系统进行编程变得更加容易。

如果你真的想更深入地理解基本思想,想象一下concatenateAllStrings函数。你可以用同样的方式做到这一点,为你遇到的每个新字符串添加你的最终价值。但你需要从一些事情开始。只有一个合理的选择:空字符串。这是因为任何字符串s'' + s //=> s。在您的情况下,您希望值x对于任何数字nn >= x都是如此。什么比每个数字少?真的只有 - 无限。

为了更深入一点,你可以调查&#34;折叠半群&#34;。

我在采访JS开发人员时实际上使用过相关的事实。这只是一旦用户表明自己具有合理的能力。我问这样的事情:

  

这听起来有点像一个技巧问题,但目标是了解如何尝试理解现有系统。 Math.max() < Math.min()这是一个奇怪的Javascript怪癖。您能否讨论如何实施maxmin来实现这一目标?

然后我引导她完成它,提供尽可能多的提示,直到她完整地解释它。没有人知道答案。候选人需要多少指导,以及她似乎能理解这些解释,这有助于我确定对她有用的东西。