2016-11-23 3 views
0

Ich schaue auf das vierte Problem von projecteuler.net und bin auf ein merkwürdiges Feature gestoßen, das mich wundern könnte, wenn irgendjemand es erklären könnte.Javascript IIFE Änderungen Ergebnis

Der folgende Code gibt 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--; 
} 

während, wenn in einem IIFE gewickelt, es 906.609 zurück, die die richtige Antwort ist.

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

Weiß jemand warum? Ich kann online keine Erklärung finden. Prost!

+1

'n' gegen' n' Rückkehr ist wahrscheinlich der Täter. das erste beendet die Funktion nicht, so dass es weitergeht, aber das zweite endet. Was passiert, wenn Sie den ersten Codeblock so ändern, dass er bricht, die Schleife? – Amy

+0

Genau das ist es genau! Hinzufügen der Pause tut genau das, was ich gehofft hatte, vielen Dank für Ihre Hilfe – gskll

Antwort

4

Die einzige n in der ersten beendet nicht den Algorithmus, während die return n in der zweiten tut. Dies kann mit einem einfachen break

durch Ersetzen n im ersten befestigt werden

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, bezwing mich dazu. +1 – KevBot

+0

Großartig, danke! – gskll