2012-07-02 56 views
0

我有一个代码块,我想将其转换为不用于while循环的递归块代码。建议?将for循环转换为递归函数

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

是否有一个特定的原因,你宁愿使用递归?它通常不会为您节省任何时钟周期,并且可能难以理解/维护。 – jbabey

+3

看起来好像没有任何好处,迭代版本在这种情况下会更具可读性和高性能 – Esailija

+0

您将使用递归的原因是,如果您发现了某种真正有效且想要的东西放大它。如果你做了一些无效或无效的事情,无论多么微不足道,递归都会使效率低下。 –

回答

2

通常的模式是一个环路转换等

while(condition(x)){ 
    //do something 
} 

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

基本上,循环条件变为如果,迭代变得明确的递归调用和变量或者是关闭或作为参数传递(取决于什么更方便)。


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

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

请注意,您需要添加一些额外的花俏,如果你也想将其转换为延续传递风格与异步使用码。我没有解释,因为我认为你只是出于好奇而做这件事。