【问题标题】:Javascript IIFE changes resultJavascript IIFE 更改结果
【发布时间】:2016-11-23 16:51:30
【问题描述】:

我正在查看 projecteuler.net 的第四个问题,并且遇到了一个奇怪的功能,我想知道是否有人可以解释一下。

以下代码返回10001

var n = 999 * 999; //biggest product with 3 digit numbers
var x;

while (n>10000) { //smallest product of 3 digit numbers
  if (n.toString() === n.toString().split('').reverse().join('')) {
    x = Math.floor(Math.sqrt(n));

    while (n % x !== 0 && x >= 100 && n/x <= 999) {
      x--;
    }

    if (n % x === 0 && x>= 100 && n/x <= 999) {
     n;
    }   
  }
  n--;
}

而当包裹在 IIFE 中时,它返回 906609,这是正确的答案。

(function euler4() {
var n = 999 * 999; //biggest product with 3 digit numbers
var x;

while (n>10000) { //smallest product of 3 digit numbers
  if (n.toString() === n.toString().split('').reverse().join('')) {
    x = Math.floor(Math.sqrt(n));

    while (n % x !== 0 && x >= 100 && n/x <= 999) {
      x--;
    }

    if (n % x === 0 && x>= 100 && n/x <= 999) {
      return n;
    }

  }
  n--;
}
}());

有人知道为什么吗?我在网上找不到解释。干杯!

【问题讨论】:

  • nreturn n 可能是罪魁祸首。第一个不会终止函数,所以它会继续运行,但第二个会终止。如果您修改第一个代码块使其break; 循环会发生什么?
  • 没错就是这样!添加中断正是我希望的,非常感谢您的帮助

标签: javascript algorithm function iife


【解决方案1】:

第一个中的唯一n 不会终止算法,而第二个中的return n 会。这可以通过将第一个 n 替换为简单的 break 来解决

var n = 999 * 999; //biggest product with 3 digit numbers
var x;

while (n>10000) { //smallest product of 3 digit numbers
  if (n.toString() === n.toString().split('').reverse().join('')) {
    x = Math.floor(Math.sqrt(n));

    while (n % x !== 0 && x >= 100 && n/x <= 999) {
      x--;
    }

    if (n % x === 0 && x>= 100 && n/x <= 999) {
     break;
    }   
  }
  n--;
}

console.log(n);

【讨论】:

  • 该死,打败我。 +1
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2022-01-20
相关资源
最近更新 更多