递归:函数不从堆栈中恢复值

时间:2014-11-23 21:35:18

标签: java recursion matrix

我使用递归方法处理一些矩阵。问题是:当递归返回时,此矩阵的值不会从堆栈中恢复(返回前后的值相同)。

我尝试做一些事情,但没有解决它。顺便说一句,我已经尝试逐步比较我的程序与其他人(详细说明朋友和工作),直到递归,两个程序都是平等的。递归后,只有我的矩阵错了......

这是我的一段代码:

    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())。问题是:这种计算发生在错误的矩阵中。

它就像递归的返回语句一样存在。我无法理解。

有什么想法?这是一个难以解释的问题,但我试过了。有问题,问我。

非常感谢。

1 个答案:

答案 0 :(得分:0)

有两种可能性。

  1. 将您的函数拆分为调用递归函数并计算其结果。
  2. 喜欢这样

     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中进行递归部分。

    1. 添加在每次自我调用中增加的深度参数(compute(M,深度+1))。如果在通话后深度为0,则您再次进入入门级别。