改进当前递归函数

Improve current recursive function?

本文关键字:递归函数      更新时间:2023-09-26

我正在努力提高递归技能,并尝试了下面的递归函数。

然而,我希望通过消除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);

传入一个数组,每个级别传入的数组少一个。当数组为空时,返回。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));

下面介绍如何使i可选。如果我没有通过,那么我们从0开始。如果它通过了,我们就用它来遍历。同样,从递归函数中去掉transform,这样它只定义了一个。

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);
};