Javascript IIFE меняет результат

Я смотрю на четвертую проблему 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--;
}
}());

Кто-нибудь знает почему? Я не могу найти объяснение в Интернете. Ура!

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);

Другие вопросы по тегам