首页 > 解决方案 > 使用递归函数将数组中的每个单词大写

问题描述

对于 Udemy 的算法挑战,问题是编写一个递归函数,将数组中的每个单词大写。他们提供了一个我不明白的解决方案。有人可以逐步向我解释会发生什么,以及为什么这段代码有效吗?

function capitalizeWords (array) {
  if (array.length === 1) {
    return [array[0].toUpperCase()];
  }
  let res = capitalizeWords(array.slice(0, -1));
  res.push(array.slice(array.length-1)[0].toUpperCase());
  return res;
 
}

标签: javascriptarraysalgorithmrecursion

解决方案


逻辑很简单,对许多递归算法都是通用的。

当要求将(非空)数组中的所有单词大写时,有两种可能的情况:

  1. 该数组只有一个元素。这很简单:您只需将该元素大写,然后在数组中返回结果。将其作为数组返回可确保res它将成为调用者中的数组。
  2. 该数组有多个元素。在这种情况下,您提取数组的一部分,不包括一个元素(您发布的代码不包括最后一个元素)。您在此切片上递归调用该函数。然后将剩余的单词大写,将其添加到递归调用返回的数组中,并将其作为结果返回。

每次递归调用都对数组的较小切片进行操作,直到达到案例 1。每次调用返回后,结果被组合并最终生成整个数组的结果。

通过调用逐步进行capitalizeWords(["ab", "cd", "ef"])

在第一次调用中,array.length == 3所以第一次if被跳过。然后它会let res = capitalizeWords(["ab", "cd"])

在第二个调用中,array.length == 2,所以第一个 if 被跳过。然后它会let res = capitalizeWords(["ab"])

在第三次调用中,array.length == 1条件if成功。它执行return [array[0].toUpperCase()];返回数组["AB"]

我们回到第二个电话,所以现在res == ["AB"]array.slice(array.length-1)[0] == "cd",我们利用它来获得"CD",并推动它res,所以现在res == ["AB", "CD"]。这与return res.

我们回到第一个调用,所以现在res == ["AB", "CD"]array.slice(array.length-1)[0] == "ef",我们利用它来获得"EF",并推动它res,所以现在res == ["AB", "CD", "EF"]。这与return res.

这是原始调用者收到的结果。


推荐阅读