Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

basic recursion - simpler solution #209

Open
husniddink opened this issue Nov 6, 2022 · 1 comment
Open

basic recursion - simpler solution #209

husniddink opened this issue Nov 6, 2022 · 1 comment

Comments

@husniddink
Copy link

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

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

    return fn(initial, arr[i], i++, arr);
}
@pierrick-marie
Copy link

pierrick-marie commented Dec 14, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants