首页 > 解决方案 > 为什么我的基本情况没有返回适当的数组?

问题描述

我正在练习递归,提示是“在给定单词数组的情况下编写递归函数,返回每个单词大写的新数组”。我知道迭代地处理这个非常简单,但这是为了练习递归。

function capitalizeWords (arr, i = 0) {
  if (i === arr.length) return arr;
  arr[i] = arr[i].toUpperCase();
  capitalizeWords(arr, i+=1);
}

let words = ['i', 'am', 'learning', 'recursion'];
capitalizeWords(words);

我的函数返回undefined。我 console.loggedarr检查它是否得到适当的更新,并且是。但是当arr我带着我的基本情况返回时,它似乎失去了对 arr 值的一些参考。不知道这怎么行不通。

我通过 Python Tutor 运行了我的代码,但我不明白当我的函数满足我的基本情况时到底发生了什么。 在 arr 应该返回之前 在 arr 应该返回之后

标签: javascriptrecursion

解决方案


您只是缺少返回语句:

function capitalizeWords (arr, i = 0) {
  if (i === arr.length) return arr;
  arr[i] = arr[i].toUpperCase();
  return capitalizeWords(arr, i+=1);
}

仅供参考 - 这也会修改原始数组。所以调用函数会改变words数组。如果您希望它是不可变的(不影响原始words数组),您可以执行以下操作:

function capitalizeWords (arr) {
  return arr.map(function (part) {
    if (Array.isArray(part)) {
      return capitalizeWords(part);
    }
    return part.toUpperCase();
  });
}

在您的问题中使用您的代码 - 这实际上是在修改words数组。如果你运行console.log(words)你会发现它已经改变了。


推荐阅读