我正在努力提高递归技能,并对下面的递归函数进行了修改。
但是,我希望通过消除i
迭代器作为correcter
的第二个参数的必要性来改进实现(以及我的理解)。我觉得当前的功能仍然非常迭代,如果这是有道理的。
如何从函数中专门消除此问题,仍然使用递归函数成功运行相同的操作?
谢谢!
// Transform an array of items, correcting gramatically
var capitals = ["MaDRid", "paRIs", "SantIAgO"]
var correcter = function(array, i) {
var transform = function(city) {
return city.charAt(0).toUpperCase() + city.slice(1).toLowerCase();
}
// base case
if (array.length === i) {
return array;
}
// action
array[i] = transform(array[i]);
// recursive case
return correcter(array, i + 1);
};
correcter(capitals, 0);
答案 0 :(得分:1)
在这里你如何让我可选。如果我没有通过,那么我们从0开始。如果它已经通过,那么我们用它来遍历。也可以通过递归函数进行转换,这样它只定义了它。
var capitals = ["MaDRid", "paRIs", "SantIAgO"]
function transform (city) {
return city.charAt(0).toUpperCase() + city.slice(1).toLowerCase();
}
function correcter (array, i) {
if ( i == null) { // <- i is optional now
i = 0;
}
// base case
if (array.length === i) {
return array;
}
// action
array[i] = transform(array[i]);
// recursive case
return correcter(array, i + 1);
};
答案 1 :(得分:1)
传入一个数组,每个级别传入一个较少的数组。当数组为空时,返回。 concat
将负责添加或不向结果数组添加任何内容(concat
如果连接空数组则不执行任何操作。)
var capitals = ["MaDRid", "paRIs", "SantIAgO"]
function correcter(array){
var city = array[0];
if(!city) return [];
var correctedCity = city.charAt(0).toUpperCase() + city.slice(1).toLowerCase();
return [correctedCity].concat(correcter(array.slice(1)));
}
var corrected = correcter(capitals);
document.write(JSON.stringify(corrected));
&#13;