0

我有一个代码块,我想将其转换为不使用 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;
}
4

1 回答 1

3

通常的模式是将循环转换为

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 以用于异步代码,则需要添加一些额外的花里胡哨。我没有解释这一点,因为我认为您只是出于好奇才这样做。

于 2012-07-02T14:25:22.780 回答