【问题标题】:2-D Recursion Always Returns 0二维递归总是返回 0
【发布时间】:2012-11-21 15:08:50
【问题描述】:

好的,这是对我的问题here 的补充,该问题已得到解答。

不想贬低前一个问题的答案,我决定这应该有自己的问题,以公平对待 JB Nizet,他回答了我的第一个问题,并因此获得了荣誉。

我正在为一个类实现一个二维数据结构。使用的方法是一个“NxN”对象数组。

所以,

Cell[][] dataStructure = new Cell[N][N];

每个单元格都依赖于其左侧单元格的输出以及其上方的单元格来创建自己的输出。将针对 000 到 111 的输入范围测试二维结构。

二维结构示例以及输出如何流入下一个单元

示例:

假设标准 X、Y 方向,我尝试使用以下方法获取右下角单元格的输出:

/**
 * Recursive method that returns the output of a given cell
 * @param row: the row the cell is in (its yPos)
 * @param inputs:
 * @param column: the column the  cell is in (its xPos)
 */
private int[] getOutput(int[] inputs,int yPos, int xPos){
        if (yPos==-1){
              int[] out = new int[2];
              out[0] = 0;  // yPos
              out[1] = inputs[xPos];  //xPos
              return out;
            }
        else if (xPos==-1){
              int[] out = new int[2];
              out[0] = inputs[yPos];  //yPos
              out[1] = 0;  //xPos
              return out;
        }

        int[] leftOutput = getOutput(inputs, yPos, xPos-1);
        int[] topOutput = getOutput(inputs, yPos-1, xPos);

         return currentStructure[yPos][xPos].getResult(leftOutput[1], topOutput[0]);
}

为了简化事情,我现在有一个 getResult 方法,用于二维结构中的单元格,对指定的输入执行逻辑。结果是两个输出的 int[],每个方向一个。

目前的 getResult 方法是这样写的:

    public int[] getResult(int left, int top)
{
    int[] resultOut = new int[2];
    if (xDirStr.equals("00")){ // AND
        resultOut[0]= left * top;
    }
    if (xDirStr.equals("01")){ // OR
        if (left ==1 || top ==1)
               resultOut[0]= 1;
        else
       resultOut[0] =0;;
    }
    if (xDirStr.equals("10")){ // NOT, USES ONLY NOT X
        if (left ==0)
       resultOut[0]= 1;
        else
        resultOut[0]= 0;
    }
    if (xDirStr.equals("11")){ // XOR
        if ( (left==1 && top==0) || (left==0 && top==1))
            resultOut[0]= 1;
        else
        resultOut[0]= 0;
    }

    if (yDirStr.equals("00")){ // AND
        resultOut[1]= left * top;
    }
    if (yDirStr.equals("01")){ // OR
        if (left ==1 || top ==1)
               resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
    if (yDirStr.equals("10")) { // NOT, USES ONLY NOT X
        if (left ==0)
        resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
    if (yDirStr.equals("11")) { // XOR
        if ( (left==1 && top==0) || (left==0 && top==1))
            resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
        return resultOut;
}

我已逐步调试,但无法发现我的问题。输出与我手动重新创建以验证它的输出不匹配,输出始终为 0。任何有用的提示将不胜感激!

我的具体问题是,为什么 getOutput 总是返回 0?从我所看到的调试来看,问题不在我的逻辑应用程序中,我没有将其包含在此处。

再次感谢。

=======更新======== 应 BevynQ 的要求,提供 3x3 样品。

在每次测试期间,沿左侧和顶部边缘的输入都会发生变化,此示例适用于基本情况 000。**NOT 函数始终返回从左侧输入的值的逻辑非。*“输出”I “我正在尝试检查我的方法”以红色圈出。

【问题讨论】:

  • 你能举个填充网格的例子吗?
  • 您希望我隐藏逻辑,还是仅表示应用于每个输出的逻辑?
  • @BevynQ 我更新了原始帖子以包含一个工作示例 fpr 一个 3x3 矩阵。
  • 什么是xDirStr?您的代码似乎在 getResult 中重复。这两个函数的输出应该是一个数组。是返回 {0} 还是只是一个空数组?
  • xDirStryDirStr,它们是我定义的逻辑控件,逻辑部分似乎工作正常。

标签: java data-structures recursion


【解决方案1】:

Eureka,它是如此简单,以至于我忽略了它并没有抓住它。问题主要与我对变量名的选择不当有关。我修补了可能有错误的数组输出,但解决方案是将返回行更改为:

     return currentStructure[xPos][yPos].getResult(leftOutput[1], topOutput[0]);

看到区别了吗?我交换了 xPos 和 yPos。我在调试的过程中理解了一个短暂的闪光时刻,但它的解释又在我的脑海中消失了。它与访问结构有关,首先需要 yPosition,然后是 xPosition……这与我们都知道和喜爱的标准 (x.y) 表示法相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多