如果我可以使用命名遞歸函數,應該有一種tco匿名遞歸函數的方法。如果有一種方法,請解釋如何在下面執行此操作是我的遞歸函數和TCO函數。如何在ES5中對遞歸匿名函數應用TCO(尾部調用優化)
function recursive(length, callback) {
tco((function (i, sum) {
var args = arguments;
if (i > length) {
console.log("break statement");
callback(sum)
return sum
} else {
return args.callee(i + 1, sum + i)
}
}))(0, 0)
}
function tco(f) {
var value;
var active = false;
var accumulated = [];
return function accumulator() {
accumulated.push(arguments);
if (!active) {
active = true;
while (accumulated.length) {
value = f.apply(this, accumulated.shift());
}
active = false;
return value;
}
}
}
我懷疑你能說出任何代碼構建一個TCO(因爲它是一個編譯器/運行優化技術,不是你可以編碼自己)。你的代碼糾結了,但我猜測它只是某種奇怪的「蹦牀」而已。 – zerkms
你爲什麼認爲遞歸需要命名函數?看看'Y'組合器。 – Bergi
這與ES2015有什麼關係?順便說一句,所有的函數都已經在符合spec規範的ES6實現中進行tailrecursion優化,所以你不必自己實現任何東西。 – Bergi