我正在解决一些练习JavaScript问题,并解决了涉及递归的问题。虽然我做对了,但我的实施方式与官方的#34;解决方案,所以我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么。
问题
实现一个函数,该函数将函数作为其第一个参数,数字
context.Set<Table>().Include(x => x.TravelCost)....
作为其第二个参数,然后执行传入函数num
次。 可以在实现中使用循环,如果使用递归则可以使用奖励积分。
我的解决方案
num
给定解决方案
function repeat(operation, num) {
if (num > 0) {
operation();
repeat(operation, num - 1);
};
};
给定的解决方案有什么能比它更好吗?
答案 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
语句中完成。在处理递归函数时,这两个属性都可以提高代码质量和可读性。