尾调用检测

Benchmark created on


Setup

/**
* Trampoline 函数,将尾递归函数转换成循环
*/
function trampoline(fn) {
    return function(...args) {
        let result = fn(...args);
        while (typeof result === 'function') {
            result = result();
        }
        return result;
    };
}
// 输入
const input = 5000;

Test runner

Ready to run.

Testing in
TestOps/sec
标准斐波那契函数
/**
* 标准的斐波那契函数
*/
function fibonacci1(n, a = 0, b = 1) {
  if (n === 0) return a;
  if (n === 1) return b;
  return fibonacci1(n - 1, b, a + b);
}

try {
    console.log('fibonacci1执行结果:', fibonacci1(input))
} catch (e) {
    console.log('fibonacci1执行失败')
}
ready
使用蹦床技术的斐波那契函数
/**
* 修改成 trampoline 支持的函数
*/
function fibonacci(n, a = 0, b = 1) {
  if (n === 0) return a;
  if (n === 1) return b;
  return () => fibonacci(n - 1, b, a + b);
}

const trampolinedFibonacci = trampoline(fibonacci);

console.log('trampolinedFibonacci执行结果:', trampolinedFibonacci(input));
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.