Javascript 我正确使用递归了吗?
我正在研究一些JavaScript实践问题,并解决了一个涉及递归的问题。虽然我做对了,但我的实现与“官方”解决方案不同,因此我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么 问题Javascript 我正确使用递归了吗?,javascript,recursion,Javascript,Recursion,我正在研究一些JavaScript实践问题,并解决了一个涉及递归的问题。虽然我做对了,但我的实现与“官方”解决方案不同,因此我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么 问题 function repeat(operation, num) { if (num > 0) { operation(); repeat(operation, num - 1); }; }; 实现一个函数,该函数将函数作为第一个参数,将数字num作为
function repeat(operation, num) {
if (num > 0) {
operation();
repeat(operation, num - 1);
};
};
实现一个函数,该函数将函数作为第一个参数,将数字num
作为第二个参数,然后执行传入的函数num
次。在您的实现中使用循环是可以的,如果您使用递归来代替,则会获得额外的分数 我的解决方案
function repeat(operation, num) {
if (num > 0) {
operation();
repeat(operation, num - 1);
};
};
给定解决方案
function repeat(operation, num) {
if (num <= 0)
return;
operation();
return repeat(operation, --num);
};
函数重复(操作,num){
如果(num解是相同的,但实际上给定的解更容易理解。有一个明确的“基本情况,”递归是在return
语句中完成的。在处理递归函数时,这两个属性都会提高代码质量和可读性。请记住。每个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);
}
}());
通过这种方式,您将中断小部件上的长时间操作。直接返回递归调用的结果有一个特定的原因。这就是所谓的“尾部递归”,聪明的运行时环境可以针对这种情况进行优化,并在不为递归调用使用任何额外堆栈空间的情况下执行(它只是重用当前函数的堆栈空间)在最新的ECMAScipt 6规范(Javascript对您和我来说)中,它特别指出运行时环境应该优化尾部递归调用
实际上,您的代码在递归调用之后实际上不做任何事情,因此它是正确的尾部递归。将递归调用与return语句放在一起可以清楚地表明它应该是尾部递归调用,运行时环境更有可能正确地优化它。if语句的相反逻辑是ir相关,但我认为在repeat(…)
前面缺少返回是一个问题。@mackiee为什么这么重要?在我看来这似乎很好。递归意味着函数本身调用。@LilDevil-因为repeat()之后没有返回值,也没有代码
statement,不需要返回。这不是更好的提问方式吗?@Zorgatone这可能被一些人认为是示例代码(这在CR上是离题的),这似乎也是关于解释代码而不是改进代码的一点。它不一定属于代码审查。我发现这非常适合堆栈溢出。这不是他的带有适当尾部递归的代码,而是给定的解决方案。反过来说:PBOT是适当的尾部递归,在fu之前没有执行任何代码nction存在。一个合适的乐观主义者应该能够在Juan的代码中认识到这一点,但我不一定指望它。知道ES6支持尾部递归真的很有趣。谢谢你,以及所有提供这一有用信息的人。你能提供关于调用nex的实践的更多外部资源参考吗我理解你的论点,我发现它是有效的。我只是想指出,对于任何来到这里的人来说,这可能是一本有趣的读物