我是否正确使用了递归?

时间:2015-11-28 21:50:59

标签: javascript recursion

我正在解决一些练习JavaScript问题,并解决了涉及递归的问题。虽然我做对了,但我的实施方式与官方的#34;解决方案,所以我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么。

问题

  

实现一个函数,该函数将函数作为其第一个参数,数字context.Set<Table>().Include(x => x.TravelCost).... 作为其第二个参数,然后执行传入函数num次。   可以在实现中使用循环,如果使用递归则可以使用奖励积分。

我的解决方案

num

给定解决方案

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

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

给定的解决方案有什么能比它更好吗?

3 个答案:

答案 0 :(得分:5)

忍受在心中。每个JavaScript开发人员都必须知道。如果递归持续很长时间,浏览器可能会终止您的脚本或向用户发出警报错误。 JavaScript开发人员经常使用这样的方法:

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

通过这种方式,您可以在小部件上打破长时间操作。

答案 1 :(得分:5)

有一个特定的原因直接返回递归调用的结果。这称为“尾递归”,一个聪明的运行时环境可以针对该情况进行优化,并且无需使用任何额外的堆栈空间来执行递归调用(它只是重用当前函数的堆栈空间)。在最新的ECMAScipt 6规范(Javascript给你和我)中,它特别指出运行时环境应该优化尾递归调用。

实际上,在递归调用之后,你的代码确实没有做任何事情,所以它是正确的尾递归。使用return语句进行递归调用可以清楚地表明它应该是一个尾递归调用,并且运行时环境更可能正确地优化它。

答案 2 :(得分:4)

解决方案是相同的,但在实践中,给定的解决方案更容易理解。有一个明确的基础案例,&#34;并且递归在return语句中完成。在处理递归函数时,这两个属性都可以提高代码质量和可读性。