javascript - 柯里化(Currying)形式的递归函数可以是尾递归吗?

标签 javascript recursion tail-recursion currying

给出以下递归map函数:

const U = f => f(f);
    
const map = f => U(h => acc => ([head, ...tail]) => head === undefined
 ? acc
 : h(h)([...acc, f(head)])(tail))([]);
    
const xs = [1,2,3,4,5];
console.log(map(x => x * x)([1,2,3,4,5]));

显然,递归调用h(h)并不是递归函数的最后一个 Action 。但是当堆栈被展开时,所发生的一切都是返回完成的累加器,而不进行任何进一步的更改或操作。 map 是否违反了我的预期尾递归?

最佳答案

the recursive call h(h) isn't the last action of the recursive function

h(h) 不是递归调用。 …(tail) 是递归调用,是的,它位于尾部位置。

如果您放弃过于复杂的 U 组合器(或者至少立即使用 Y 组合器),这可能会变得更加明显:

const map = f => {
  const mapF = acc => ([head, ...tail]) => head === undefined
    ? acc
    : mapF([...acc, f(head)])(tail);
  return mapF([]);
};

关于javascript - 柯里化(Currying)形式的递归函数可以是尾递归吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38467951/

相关文章:

javascript - 在 safari 5.34.57.2 上以 css 或 js 订购 div

javascript - 在 div 中加载 Facebook 帖子?

javascript - 翻译正则表达式

c++ - 这个递归阶乘实现有什么问题?

go - Go 中的尾调用优化

recursion - 如何对二叉树进行尾递归?

javascript - React-router 不会在不同路径上重新挂载组件

java - 缓慢构建路径列表

javascript - js/jQuery - 通过鼠标位置退出功能

Erlang:这可以在没有 list:reverse 的情况下完成吗?