2016-03-25 2 views
1

Ich habe ein kleines Problem mit dem Schreiben einer Funktion, die Zahlen faktorisiert. Der schwierige Teil ist erledigt. Allerdings kann ich nicht sagen, die Funktion zu 1 zurückgeben, wenn num 0 ist.Factorize-Funktion Javascript

PS: Welche anderen Möglichkeiten würden Sie die gleiche Funktion in JavaScript schreiben?

var arrOfNum = []; 

function factorialize(num) { 

    for(i = 1; i <= num; i++){ 
    // push all numbers to array 
    arrOfNum.push(i); 
    } 

    // multiply each element of array 
    var result = arrOfNum.reduce(function(a,b){ 
    return a * b; 
    }); 

    console.log(result); 
} 
+1

Es sieht so aus, als ob Sie "Factorials" und "Factorization" verwirren. – georg

+0

überprüfen Sie http://StackOverflow.com/Questions/3959211/fast-Factorial-Function-in-Javascript auch für eine Diskussion über js faktorielle impl –

Antwort

1

Roundup:

  • Erklärung lokale Variable i fehlt

    var i; 
    
  • Erklärung anderen verwendeten Variablen über die Funktion verteilt. Ein besserer Weg besteht darin, die Variablen oben in der Funktion zu deklarieren.

  • Array#reduce benötigt für diese Aufgabe einen initialValue als zweiten Parameter.

    Das erste Mal, wenn der Rückruf aufgerufen wird, previousValue und currentValue kann einen von zwei Werten sein. Wenn initialValue in dem zu reduzierenden Aufruf bereitgestellt wird, ist previousValue gleich initialValue und currentValue entspricht dem ersten Wert im Array. Wenn kein initialValue angegeben wurde, entspricht previousValue dem ersten Wert im Array und currentValue entspricht dem zweiten Wert.

function factorial(num) { 
 
    var i, 
 
     arrOfNum = [], 
 
     result; 
 

 
    for (i = 1; i <= num; i++) { 
 
     // push all numbers to array 
 
     arrOfNum.push(i); 
 
    } 
 

 
    // multiply each element of array 
 
    result = arrOfNum.reduce(function (a, b) { 
 
     return a * b; 
 
    }, 1); 
 

 
    document.write(num+'! = '+result + '<br>'); 
 
} 
 
factorial(0); 
 
factorial(1); 
 
factorial(2); 
 
factorial(5); 
 
factorial(8);

0

einfach den Wert zurück 1

function factorialize(num) { 
     if (num < 1) return 1; //this line is added 

     for(i = 1; i <= num; i++){ 
     arrOfNum.push(i); 
     } 
     var result = arrOfNum.reduce(function(a,b){ 
      return a * b; 
     }); 
     console.log(result); 
    } 
0

Wenn Sie reduce ein Anfangswert von 1 geben, alles wird gut funktionieren, auch ohne eine explizite Kontrolle:

var result = arrOfNum.reduce(function(a,b){ 
    return a * b; 
}, 1); 
    ^^^   // PROVIDE EXPLICIT INITIAL VALUE TO REDUCE 
0
function factorial(n) { 
    return Array.apply(0, Array(n)).reduce(function(x, y, z) { 
    return x + x * z; //1+(1*0), 1+(1*1),2+(2*2), 6+(6*3), 24+(24*4), ... 
    }, 1); 
} 

DEMO

+0

Sind Sie sicher über 'x + x * z'? –

+0

@torazaburo ja, X: vorherigerWert, Y: aktuellerWert, Z: aktuellerIndex, also wird es wie folgt aussehen: 1+ (1 * 0), 1+ (1 * 1), 2 + (2 * 2), 6+ (6 * 3), 24+ (24 * 4) usw –

3

Sie haben bereits eine for Schleife, in dem Sie sofort die Fakultät berechnen kann, ohne Array und reduzieren.

function factorial(num) { 
    var result = 1; 
    for(i = 2; i <= num; i++) { 
     result *= i; 
    } 
    return result; 
} 
Verwandte Themen