我有一个代码块我想转换为不使用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;
}
答案 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以与异步代码一起使用,则需要添加一些额外的铃声和口哨声。我没有解释,因为我认为你出于好奇只是这样做。