将for循环转换为递归函数

时间:2012-07-02 14:06:16

标签: javascript loops recursion for-loop

我有一个代码块我想转换为不使用for或while循环的递归代码块。建议?

sprite = function(dataset, pos){
  var size ={nrows : 3, ncolumns :3};
  var data = [];
  for(row = pos.row0; row < pos.row0+size.nrows; row++) {
    for(column = pos.column0; column < pos.column0+size.ncolumns; column++) {
      if(column == pos.column0) {
        data.push([dataset[row][column]]);
      } else {
        data[row].push(dataset[row][column]);
      }
    }  
  }
  return data;
}

1 个答案:

答案 0 :(得分:2)

通常的模式是转换像

这样的循环
while(condition(x)){
    //do something
}

进入

var go = function(x){
    if(condition(x)){
       //do something
       return go(nextValueOfX);
    }else{
       return finalReturnValue;
    }
}
go(0);

基本上,循环条件变为if,迭代变成显式递归调用,变量被关闭或作为参数传递(取决于更方便的东西)。


在您的情况下,它可能看起来像

sprite = function(dataset, pos){
  var size ={nrows : 3, ncolumns :3};
  var data = [];
  var outerFor = function(row){
     if(row < pos.row0+size.nrows){
        var innerFor = ...;
        innerFor(0);
        outerFor(row+1);
     }
  }
  outerFor(0);
  return data;
}

请注意,如果您还想将此转换为continuation-passing-style以与异步代码一起使用,则需要添加一些额外的铃声和口哨声。我没有解释,因为我认为你出于好奇只是这样做。