timoxley/functional-javascript-workshop

basic recursion - simpler solution

Opened this issue · 1 comments

function reduce(arr, fn, initial) {
    let i = 0;

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

    return fn(initial, arr[i], i++, arr);
}

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 ;)