我正在解决一些 JavaScript 练习题,并解决了一个涉及递归的问题。虽然我做对了,但我的实现与“官方”解决方案不同,所以我想知道是否有人对官方答案是否更好有任何见解,如果是,为什么。
问题
Implement a function that takes a function as its first argument, a number
num
as its second argument, then executes the passed in functionnum
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/