timoxley / functional-javascript-workshop

A functional javascript workshop. No libraries required (i.e. no underscore), just ES5.
2.06k stars 441 forks source link

basic recursion - simpler solution #209

Open husniddink opened 1 year ago

husniddink commented 1 year ago
function reduce(arr, fn, initial) {
    let i = 0;

    if (arr.length === i) {
        return initial;
    }

    return fn(initial, arr[i], i++, arr);
}
pierrick-marie commented 8 months ago

Hi,

I tried your solution but it does not pass the evaluation and I don't see where is the recursion in the function.

I have another solution quite similar to yours, without index. I like writing recursion without counter. I think it's more "elegant".

function reduce(arr, fn, initial) {

    // End condition: if arr is empty returns the initial value 
    if(!arr.length) {
        return initial;
    }

    // Call the reducer and save result in initial
    // It is possible to call the reducer directly in the return instruction.
    // I prefer separate these instructions for more visibility. 
    initial = fn(initial, arr[0]);

    // Recursion: recall reduce with the tail of arr (arr without its head)
    // if arr has only one element, arr.slice returns an empty array.
    // The empty array will trigger the end condition
    return reduce(arr.slice(1), fn, initial)
}

The shorter version :

function reduce(arr, fn, initial) {

    if(!arr.length) {
        return initial;
    }

    return reduce(arr.slice(1), fn, fn(initial, arr[0]))
}

I have to confess I have absolutely no idea about what is the best solution in terms of performance. In my opinion that kind of alternative is more readable than the official solution. By the way, thank you very much for that marvelous project ! Keep going ;)