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

非同期コードで使用するためにこれを継続渡しスタイルに変換したい場合は、追加のベルとホイッスルを追加する必要があることに注意してください。あなたが好奇心からこれをしているだけだと思う​​ので、私はそれを説明しませんでした.

于 2012-07-02T14:25:22.780 に答える