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.