Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我正确使用递归了吗?_Javascript_Recursion - Fatal编程技术网

Javascript 我正确使用递归了吗?

Javascript 我正确使用递归了吗?,javascript,recursion,Javascript,Recursion,我正在研究一些JavaScript实践问题,并解决了一个涉及递归的问题。虽然我做对了,但我的实现与“官方”解决方案不同,因此我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么 问题 function repeat(operation, num) { if (num > 0) { operation(); repeat(operation, num - 1); }; }; 实现一个函数,该函数将函数作为第一个参数,将数字num作为

我正在研究一些JavaScript实践问题,并解决了一个涉及递归的问题。虽然我做对了,但我的实现与“官方”解决方案不同,因此我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么

问题

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的实践的更多外部资源参考吗我理解你的论点,我发现它是有效的。我只是想指出,对于任何来到这里的人来说,这可能是一本有趣的读物