Javascript尾部递归而不是循环

Javascript tail recursion instead of loop

本文关键字:循环 尾部 递归 Javascript      更新时间:2024-04-05

在Douglas Crockford的一次演讲中,他赞成使用尾部递归而不是循环。这个代码被出示了,

function repeat(myFunc) {
  if (myFunc !== undefined) {
    return repeat(myFunc);
  }
}

我想定义一个myFunc,但不知道静态计数器是否可以在函数调用期间保持其状态,或者使用全局计数器。但作为javascript的新手,我想先问一下。这怎么能在一个例子中使用,比如从10倒计时到0?谢谢

您需要在某个地方调用函数myFunc,并评估结果以供进一步调用repeat

function repeat(myFunc) {
    if (myFunc()) {
        repeat(myFunc);
    }
}
var count = 10;
repeat(function () {
    document.write(count + '<br>');
    count--;
    return count >= 0;
});
 

这里有一个版本,它在没有全局变量的情况下保持状态:

function repeat(myFunc, arg) {
    if ((arg = myFunc(arg)) !== undefined) {
        repeat(myFunc, arg);
    }
}
repeat(function (count) {
    document.write(count + ',');
    count--;
    if (count >= 0) return count;
}, 10);
 

这怎么能在一个例子中使用,比如从10倒计时到0?

将一个Number传递给repeat,用递减的数字作为参数调用repeat,直到变量参数等于0

function repeat(n) {
  console.log(n)
  if (n) {
    return repeat(--n);
  }
}
repeat(10)

不确定我是否理解您想要的方法,但您可以使用此方法递归递减

function repeat(myFunc, times) {
  if(times > 0 && typeof myFunc == 'function') {
    myFunc(times);
    repeat(myFunc, times-1);
  }
}
repeat(alert, 10);