javascript - 我是否正确使用了递归?

标签 javascript recursion

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

问题

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.

我的解决方案

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

给定的解决方案有什么地方比我的更好吗?

最佳答案

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

实际上,您的代码在递归调用后实际上没有做任何事情,因此它是适当的尾递归。将递归调用与 return 语句放在一起可以清楚地表明它应该是尾递归调用,并且运行时环境更有可能正确地优化它。

关于javascript - 我是否正确使用了递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976825/

相关文章:

python - 使用 href 引用抓取网站

javascript - Ext-JS 快速提示图标 CSS 问题

javascript - 动态图像刷新

java - 按字段递归对对象的 ArrayList 进行排序

python - yield 与返回的不同结果

c++ - 使用循环遍历目录

javascript - Javascript 中的 eval 函数有什么用?

Javascript 自定义异常

javascript - 更改导航栏折叠宽度 Twitter Bootstrap 3

sql - 具有递归 CTE : sorting/ordering children by popularity while retaining tree structure (parents always above children) 的 Postgres