递归实现数组单词首字母大写:是思路还是代码问题?
递归实现数组单词首字母大写问题
功能要求
- 输入:由小写单词组成的数组
- 要求:使用递归实现,返回所有单词首字母大写后的新数组
- 输出示例:输入
['car','taco','banana'],返回['Car','Taco','Banana']
初始设想的执行逻辑
// 递归调用过程 1st call: ['Car'] + capitalizeFirst([taco, banana]); 2nd call: ['Taco'] + capitalizeFirst([banana]); 3rd call: ['Banana'] + capitalizeFirst([]); // 回溯返回过程 ['Banana'] + [] ['Taco'] + ['Banana'] ['Car'] + ['Taco','Banana'] 最终返回 ['Car','Taco','Banana']
初始错误代码&问题
实际运行初始代码后,得到的结果是字符串拼接结果'CarTacoBanana',不符合数组输出要求。
初始代码如下:
function capitalizeFirst (arr) { if (!arr.length) return ''; arr[0] = arr[0].charAt(0).toUpperCase() + arr[0].slice(1); return [ arr[0] + capitalizeFirst(arr.slice(1)) ]; } capitalizeFirst(['car','taco','banana']);
错误原因
- 递归终止条件返回值错误:空数组输入时返回了空字符串
'',而非空数组 - 结果合并逻辑错误:使用
+运算符拼接触发了字符串隐式转换,而非数组拼接
正确实现代码
function capitalizeFirst (arr) { let newArr = []; if (!arr.length) { return newArr; } else { arr[0] = arr[0].charAt(0).toUpperCase() + arr[0].slice(1); newArr.push(arr[0]); } // 用数组concat方法拼接当前结果和递归返回的后续数组 return newArr.concat(capitalizeFirst(arr.slice(1))) }
实现说明
- 递归终止时返回空数组,保证所有回溯阶段的合并都是数组操作
- 每次递归只处理当前数组第一个元素,把首字母大写后存入临时数组
- 用
concat方法合并当前临时数组和剩余元素递归处理后的结果,最终返回完整的目标数组
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

