我使用递归方法处理一些矩阵。问题是:当递归返回时,此矩阵的值不会从堆栈中恢复(返回前后的值相同)。
我尝试做一些事情,但没有解决它。顺便说一句,我已经尝试逐步比较我的程序与其他人(详细说明朋友和工作),直到递归,两个程序都是平等的。递归后,只有我的矩阵错了......
这是我的一段代码:
public static Integer [][] Complement(Integer[][] M){
if (OneRowNotEmpty(M)) { // just one row of matrix are different then 0s
return changeSignalLine(M);
}
else {
int row = DefineLineToErase(M);
matrix = Complement(zeraLinha(row, M); // recursion
dosomething();
}
/* make some stuffs, but at this point my M are wrong*/
return finalMatrix; // just for illustrate. this matrix are built in lines after recursion
}
举个例子比较容易: 在级别" A"中,我的矩阵是:
[ 00 00] (matrix on level "A" of recursion) M = [ 11 10] [ 11 01]
我们假设我的擦除行是第二行,所以:
[ 00 00] (matrix on level "B" of recursion) M = [ 00 00] [ 11 01]
此时,在级别" B"上,函数OneRowNotEmpty(M)为真,因此返回以下矩阵:
[ 00 00] (til' here, everything is fine) M = [ 00 00] [-11 -01]
此时,递归必须返回到矩阵M的等级" A"并继续计算(doSomething()),但它返回到矩阵M的水平" B"并继续计算(doSomething())。问题是:这种计算发生在错误的矩阵中。
它就像递归的返回语句一样存在。我无法理解。
有什么想法?这是一个难以解释的问题,但我试过了。有问题,问我。
非常感谢。
答案 0 :(得分:0)
有两种可能性。
喜欢这样
Integer [][] complement ( Integer[][] m ){
Integer[][] recurResult = recursiveComplement ( m );
// recursion has finished
return doSomething ( recurResult );
}
Integer[][] recursiveComplement( Integer[][] m ){
if( endCondition(m) ) return m; // Checks if Recursion shall be ended.
Integer[][] levelM = doComplementTransform(m);
return recursiveComplement( levelM );
}
在recursiveComplement中进行递归部分。