2016-11-23 2 views
0

Я смотрю на четвертую проблему projecteuler.net и натолкнулся на любопытную функцию, которую мне интересно, может ли кто-нибудь объяснить.Javascript IIFE изменяет результат

Следующий код возвращает 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' против' возвращения n', вероятно, преступник. первая не прерывает функцию, поэтому она продолжает двигаться, но вторая заканчивается. Что произойдет, если вы измените первый блок кода так, чтобы он «ломал» цикл? – Amy

+0

Правильно, это точно! Добавление перерыва делает именно то, что я надеялся, большое спасибо за вашу помощь – gskll

ответ

4

Одинокий 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);

+0

Dang, избили меня. +1 – KevBot

+0

Отлично, спасибо! – gskll

Смежные вопросы