curry形式的递归函数是否可以尾递归?

时间:2016-07-19 20:30:06

标签: 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)不是递归函数的最后一个动作。但是当堆栈被解开时,发生的一切都是返回完成的累加器而没有任何进一步的更改或操作。 map是否符合我的预期尾递归?

1 个答案:

答案 0 :(得分:1)

  

递归调用structure(list(COD = structure(c(3L, 1L, 2L, 3L, 3L, 2L, 3L), .Label = c("xf5", "xr1", "xx4"), class = "factor"), Time = structure(c(1468937730, 1468934610, 1468944930, 1468941620, 1468937910, 1468945050, 1468937750 ), class = c("POSIXct", "POSIXt"), tzone = ""), score = c(5452L, 5321L, 5232L, 1322L, 2344L, 8676L, 9445L), position = c(2454L, 342L, 2328L, 2432L, 2534L, 4566L, 7655L)), .Names = c("COD", "Time", "score", "position"), row.names = c(NA, -7L), class = "data.frame") 不是递归函数的最后一个动作

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

如果丢弃过于复杂的…(tail)组合子(或者至少立即使用U组合子),这可能会更明显:

Y