如何编写递归归约函数?

How to write a recursive reduce function?

我正在尝试使用递归编写一个 reduce 函数。我正在学习递归及其练习的一部分,因此我试图了解在我的代码中不起作用的是什么。很高兴有任何帮助! Ps。它假设从数组的末尾开始(所以例如 yeh 变成 hey)

var strings = function(previous,current) {
    return previous+current;
};

function reducing(arr,start,func) {

    if (arr.length == 0) {
        return start;
    }
    else if (arr.length == 1) {
        return arr[0];
    }
    else {
        return func(start,arr[arr.length-1]) + reducing(arr.slice(1),start,func);
    }
}

reducing(['y','e','h'],'',strings)

这可能是问题所在,而不是 reducing(arr.slice(1),start,func) 尝试 reducing(arr.slice(0, arr.length-1),start, func) 如下:

function reducing(arr,start,func) {
  if (arr.length == 0) {
     return start;
  }
  else if (arr.length == 1) {
     return arr[0];
  }
  else {
    return func(start, arr[arr.length-1]) + reducing(arr.slice(0, arr.length -1),start,func);
 }
}

另一个解决方案:

const reduce = (arr, fn, initial) =>
  (reduceAux = (index, value) =>
    index > arr.length-1
      ? value
      : reduceAux(index+1, fn(value, arr[index], index, value))
  )(0, initial);