Kolejne ćwiczenie, tym razem silnia w dwóch wydaniach. Do dzieła!

Rekurencja:

function factorialRec(num){
    if(num < 0)
        return -1;
    if(num === 1 || num === 0)
        return 1;
    return num * factorialRec(num-1);
}

Mamy tu mini-mikro optymalizację, short circuiting na num === 1 wpierw (1! wywołuje się przy każdym wywołaniu funkcji, 0! tylko jak wywołamy factorialRec dla 0).

Ok, iteracja:

function factorialIter(num){

    let result = num;

    if(num < 0)
        return -1;
    if(num === 1 || num === 0)
        return 1;

    while(num > 1){

        num--;
        result = result * num;
    }

    return result;

}

Też mini-mikro optymalizacja, liczymy od góry (dzięki czemu pierwszą liczbę, największą mamy z głowy) i przestajemy liczyć przed 1 (mnożenie przez 1 nie ma sensu).

W kontekście big O to nawet niezauważalne optymalizacje, w konteście big O to nawet nie ma znaczenia czy mamy jedną pętlę, czy 10 albo 100 pętli (ważne, że po sobie, nie zagnieżdżonych), ale ładnie to pokazuje, że wiemy co robimy.