如何在递归函数中共享返回值

How can I share a return value in recursive function?

本文关键字:共享 返回值 递归函数      更新时间:2023-11-14

在常规函数中,我可以在每次迭代中使用相同的结果数组:

_.unique = function(array) {
  var result = [];
  for (var i = 0; i < array.length; i++) {
    if (result.indexOf(array[i]) < 0) {
      result.push(array[i]);
    }
  }
  return result;
};

在使用递归函数时,我如何才能做到这一点(并不断向结果数组推送)?

_.unique = function(array) {
  var result = [];

  if (array.length === 0) {
    return result;
  } else {
    if (result.indexOf(array[0]) < 0) {
      result.push(array[0]);
    }
    return _.unique(array.slice(1));
  }
  return result;
};

使用这个,我得到了错误的输出。我可以使用内部助手函数来完成此操作,但我不喜欢。

必须将结果传递给另一个函数,以便被调用的函数知道该项是否唯一。在下面的代码示例中,传递的唯一项数组的名称为p_result

这是一个工作代码示例:

_.unique = function(array, p_result) {
    if(!(Object.prototype.toString.call(p_result) == '[object Array]')) p_result = [];
    var result = p_result;
    if(array.length === 0) return result;
    if(p_result.indexOf(array[0]) < 0) {
        result.push(array[0]);
    }
    return _.unique(array.slice(1), result);
};
// e.g. _.unique([0, 1, 1, 2, 3, 7, 4]) gives [0, 1, 2, 3, 7, 4]

使用以上代码的fiddle示例