改进当前的递归函数?

时间:2015-11-05 22:02:42

标签: javascript recursion closures

我正在努力提高递归技能,并对下面的递归函数进行了修改。

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

2 个答案:

答案 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如果连接空数组则不执行任何操作。)

&#13;
&#13;
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;
&#13;
&#13;

相关问题