【问题标题】:Recursive use of Javascript returns undefined递归使用 Javascript 返回 undefined
【发布时间】:2017-11-02 08:22:58
【问题描述】:

我正在尝试使用 Javascript 编写递归函数,但显然我错过了一些东西,我无法让它在我想要的位置返回。 在下面的示例中,我希望在日志中看到 baz=18,但是 baz 是未定义的。

https://jsfiddle.net/n8fg1h3v/1/

有什么想法吗?

function foo(arr) {
  if (arr[0]==7) {
    return 18
  } else {
    arr = arr.slice(1,arr.length);
    foo(arr);
  }
}

var arr1 = [9,1,2,3,4,7,6];
var baz = foo(arr1);
console.log(baz)

【问题讨论】:

  • 请注意,虽然您可以在任何地方使用 Javascript 进行重新分配 (arr = ...),但这在递归算法中并不常见。将表达式作为参数传递 (foo(arr.slice(...)))

标签: javascript recursion functional-programming


【解决方案1】:

你需要在函数内部调用foo返回。

return foo(arr);

function foo(arr) {
    if (arr[0] == 7) {
        return 18;
    } else {
        arr = arr.slice(1, arr.length);
        return foo(arr);
    }
}

var arr1 = [9, 1, 2, 3, 4, 7, 6];
var baz = foo(arr1);
console.log(baz)

【讨论】:

  • 如果数组中没有7,你想使用默认值吗?
  • 不,这只是一个简单的示例,用于展示并尝试理解为什么我的 if then else 语句在 if 中的 return 没有像我预期的那样工作。按照您的建议添加return foo(arr),它在简单示例和我的实际问题中都可以正常工作。谢谢! (我不能再接受大约 10 分钟的答案,我会在那之后再做。)
【解决方案2】:

我会这样做:

function foo(arr) {
  var el = arr.find(el => el === 7);  
  return el ? 18 : '7 was not found';
}

var bar = foo([9, 1, 2, 3, 4, 7, 6]);
console.log(bar);

var baz = foo([9, 1, 2, 3, 4, 8, 6]);
console.log(baz);

【讨论】:

  • 我会使用some,因为它会破坏迭代,但它与递归无关。
  • 另外Array.prototype.find() 打破了迭代。我理解你关于递归的观点,但在这里我认为没有必要
猜你喜欢
  • 2017-01-28
  • 2022-11-14
  • 2020-01-26
  • 2012-05-29
  • 2021-11-09
  • 2016-05-27
  • 2018-06-10
  • 1970-01-01
相关资源
最近更新 更多