在 JavaScript 中封装尾部调用优化的实用程序
Utility to encapsulate tail-call optimisation in JavaScript?
我一直在阅读JavaScript中的递归函数和尾部调用优化(TCO)。我的目标是克服递归函数中的堆栈溢出:
function factorial(n) {
function recur(n, acc) {
if (n === 0) {
return acc;
} else {
return recur(n - 1, n * acc);
}
}
return recur(n, 1);
}
factorial(5); // 120
console.log(factorial(4585759)); // Maximum call stack size exceeded
我找到了如何使用thunk
和trampoline
来克服递归函数中的堆栈溢出:
let thunk = function (fn) {
return function() {
let args = Array.prototype.slice.apply(arguments);
return function() { return fn.apply(this, args); };
};
};
function trampoline(f) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function factorial(n) {
let recur = function(x, n) {
if (n === 0) {
return x;
} else {
return thunk(recur)(n * x, n - 1);
}
};
return trampoline(thunk(recur)(1, n));
}
console.log(factorial(5)); // 120
console.log(factorial(4585759)); // Infinity
但是,我不喜欢被迫编写递归函数的方式。我发现了一个名为 TCO
的函数的一些实现:
function tco(fn) {
var active, nextArgs;
return function() {
var result;
nextArgs = arguments;
if (!active) {
active = true;
while (nextArgs) {
result = fn.apply(this, [nextArgs, nextArgs = null][0]);
}
active = false;
}
return result;
};
}
该函数应允许以下内容:
let factorialToc = tco(function(n) {
function recur(n, acc) {
if (n === 0) {
return acc;
} else {
return recur(n - 1, n * acc);
}
};
return recur(n, 1);
});
但它不起作用:
factorialToc(5); // 120
console.log(factorialToc(4585759)); // Maximum call stack size exceeded
是否有任何实用程序函数来封装 TCO?
您将该tco
函数应用于非递归factorialToc
函数,而不是应用于导致堆栈溢出的recur
。它应该是
function factorialToc(n) {
const recur = tco(function(n, acc) {
if (n === 0) {
return acc;
} else {
return recur(n - 1, n * acc);
}
});
return recur(n, 1);
}
相关文章:
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- addthis:addthis实用程序框架的JS安全错误
- 如何将InfoBoxes与googlemaps实用程序库v3绑定到循环中的点击侦听器
- 确定公开JS实用程序函数的最佳模式
- 用于日期格式的 JavaScript 实用程序
- 如何让 Mocha 加载定义全局钩子或实用程序的帮助程序.js文件
- 试图通过一些实用程序减少 redux 样板
- 如何使用谷歌地图实用程序库在单击时显示弹出框文本
- 如何通过jQuery $.load()实用程序函数获取PHP将utf-8字符串传递给JavaScript
- 优化填充程序配置
- 优化引导程序时出现早午餐错误
- 何时有时将对象类型定义为将实例绑定方法镜像为构造函数上的静态实用程序函数很有用
- Rally sdk 2实用程序用于创建指向详细信息页面/编辑弹出窗口的链接
- 使用Javascript实用程序意味着什么
- 挖空.js和分块实用程序
- 函数的实用程序类
- 框架中的实用程序,用于更轻松地定义 SVG 路径字符串
- 如何在引导程序中使用间距实用程序类
- 是否有JQuery或Javascript警告消息实用程序,可以在不干扰用户的情况下显示和超时
- 在 JavaScript 中封装尾部调用优化的实用程序