javascript - 使用递归函数将数组中的每个单词大写
问题描述
对于 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;
}
解决方案
逻辑很简单,对许多递归算法都是通用的。
当要求将(非空)数组中的所有单词大写时,有两种可能的情况:
- 该数组只有一个元素。这很简单:您只需将该元素大写,然后在数组中返回结果。将其作为数组返回可确保
res
它将成为调用者中的数组。 - 该数组有多个元素。在这种情况下,您提取数组的一部分,不包括一个元素(您发布的代码不包括最后一个元素)。您在此切片上递归调用该函数。然后将剩余的单词大写,将其添加到递归调用返回的数组中,并将其作为结果返回。
每次递归调用都对数组的较小切片进行操作,直到达到案例 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
.
这是原始调用者收到的结果。
推荐阅读
- google-sheets - 当我刷新/更新工作表时,有没有办法停止单元格中的数据更改?
- android - 尝试将嵌套 for 循环的旧 Java 函数转换为 RxJava 样式
- batch-file - 导航到文件夹并从 CMD 运行 sendEmail
- javascript - 什么被认为是普通对象?
- linux - 在 Fortran 代码中执行 execute_command_line() 时出错
- listview - Hot track doesn't work in a virtual TListView while dragging
- powershell - powershell,查找日期字符串
- reactjs - 处理受控组件中的默认值的最佳方法是什么?
- python - 使用来自 web 应用程序的图像 blob 文件作为 python 程序的输入
- python - 使用索引运算符时 Python 字典读取错误