2016-11-23 54 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'與'回報N'可能是罪魁禍首。第一個不終止函數,所以它繼續前進,但第二個終止。如果修改第一個代碼塊,會發生什麼情況會「中斷」循環? – Amy

+0

就是這樣!添加休息正是我所希望的,非常感謝你的幫助 – gskll

回答

4

獨行n中的第一個不會終止算法,而第二個是return 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

黨,打我。 +1 – KevBot

+0

太好了,謝謝! – gskll