2017-02-24 61 views
0

我做了一個函數來檢查一個數是不是質數,如果不是,則返回該數,否則(如果它是素數)則返回0.在JavaScript中減法的意外結果

var maybePrimeNumber = [5, 8, 11, 14, 17, 20, 23, 28, 31]; //numbers to test 

function isNotPrime(integer){ 
    var prime = true;   //start off assuming that it is a prime nr for now 
    var returnNumber = 0;  //to be returned at the end 

    for(i = 2; i<integer; i++){ //go from 2 up to the number, 
     if(integer % i === 0){ //if the number is divisible by any nr between 2 and itself, 
      prime = false;  //then say that it isn't a prime number 
     } 
    } 

    if(!prime){     //if it isn't a prime number, then 
     returnNumber = integer; //prepare to send back the number 
    } 

    return returnNumber; 
} 

document.getElementById("demo").innerHTML = maybePrimeNumber.reduce(
    (total, integer) => {return total + isNotPrime(integer)} 
); 
//sum all non-prime numbers up from the array and put the sum into the paragraph "demo" 

而且問題如下:

當我運行它,它給了我75,但應該給我70

所以,當我這個替換最後一行:

document.getElementById("demo").innerHTML = isNotPrime(maybePrimeNumber[0]); 

要檢查它是否錯誤地計算5是一個非質數 - 它返回0,所以它不會計算錯誤。

爲什麼它給總和75而不是70然後?

+2

在您的reduce調用中,指定第二個參數,即total'的初始值 - 爲'0' - 否則它將是數組中的第一個數字,即'5',因此您的' 5'回答。請參閱:https://jsfiddle.net/88gx55tm/ – tymeJV

回答

5

您應該始終包含一個初始值reduce

document.getElementById("demo").innerHTML = maybePrimeNumber 
    .reduce((total, integer) => {return total + isNotPrime(integer)}, 0); 

total第一個值是數組的第一元件,如果不包括初始值,所以5總是包括在總和。

0

下面的函數可以工作,並且更乾淨。請注意,命名約定會建議函數名稱isSomething返回布爾值。 (注意我使用了console.log,因爲我在節點中測試了這個)。

const maybePrimeNumber = [5, 8, 11, 14, 17, 20, 23, 28, 31]; //numbers to test 
function isNotPrime(integer) { 
    for(i = 2; i < integer/2; i++){ //go from 2 up to the number, 
    if(integer % i === 0){ //if the number is divisible by any nr between 2 and itself, 
     return true;   //then say that it isn't a prime number 
    } 
    } 

    return false; 
} 

console.log(maybePrimeNumber.reduce((total, integer) => total + (isNotPrime(integer) ? integer : 0), 0)); 

由於@Xufox在他的回答中指出,您的減少實際上是你應該提供一個初始值(0)作爲第二個參數.reduce()問題;否則數組中的第一個值將被視爲初始值total