简体   繁体   中英

Did I use recursion correctly?

I'm working through some practice JavaScript problems, and solved a problem involving recursion. Although I got it right, my implementation is different from the "official" solution, so I was wondering if anyone had any insight on whether the official answer is better and if so, why.

Question

Implement a function that takes a function as its first argument, a number num as its second argument, then executes the passed in function num times.
It's ok to use a loop in your implementation, bonus points if you use recursion instead.

My Solution

function repeat(operation, num) {
    if (num > 0) {
        operation();

        repeat(operation, num - 1);
    };
};

Given Solution

function repeat(operation, num) {
    if (num <= 0)
        return;

    operation();

    return repeat(operation, --num);
};

Is there anything about the given solution that makes it better than mine?

Just bear in the mind. There is something that every JavaScript developer MUST know. If recursion continues very long time the browser can kill your script or alert error to user. Often JavaScript developers uses approaches like this:

var inputArray = [1,2,3,4,5,6];

(function handleArray() {
    var currentElement = inputArray.shift();
    // do something with currentElement 
    if (inputArray.length > 0 ) {
        setTimeout(handleArray, 0);
    }
}()); 

In this way you will break long time operation on small parts.

There is a specific reason to directly return the result of a recursive call. This is called "tail recursion", and a clever run-time environment can optimise for that case and execute without using any additional stack space for the recursive calls (it simply reuses the stack space of the current function). In the latest ECMAScipt 6 specification (Javascript to you and me) it specifically calls out that the runtime environment should optimise tail-recursive calls.

In practice, your code does in fact not do anything after the recursive call, so it is properly tail-recursive. Putting the recursive call with a return statement makes it clear that it should be a tail-recursive call, and a bit more likely that the run-time environment will correctly optimise it.

The solutions are identical, but in practice the given solution is easier to understand. There is a clear "base case," and the recursion is done in the return statement. Both of these properties lead to better code quality and readability when dealing with recursive functions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM