以递归方式返回2D数组中元素的位置

时间:2016-03-21 18:18:00

标签: java recursion

到目前为止,我为此方法编写的代码是:

int rowCount = 0;
int columnCount = 0;
Pair p = new Pair(0, 0);
public Pair search2D(int[][] data, int element) {
     if(data[rowCount].length==columnCount)
        {
            rowCount++;
            columnCount=0;
        }

        if(data.length > rowCount)
        {
            if(data[rowCount][columnCount] == element)
            {
                p = new Pair(rowCount, columnCount);
            }
            else
            {
                columnCount++;
                search2D(data, element);
            }
        }
        return p;
}

“Pair”是我写的一个类,因为Java只允许我返回一个数字,而我正在尝试返回保存元素位置的索引。

在我的主要方法中,我有

    int[][] table = new int[][] { {3, 2, 8}, {3, 5, 6} };
    System.out.println(r.search2D(table, 5));
    System.out.println(r.search2D(table, 8));

但是,两个输出都是(1,1)。我被告知不要使用任何循环,任何人都可以指出我正确的方向或告诉我问题出在哪里?

3 个答案:

答案 0 :(得分:2)

找到r.search2D(table, 5)后,您没有重置rowcountcolumncount的值。因此,对于r.search2D(table, 8),您的回答为1,1。

要解决此问题,请将功能修改为:

public Pair search2D(int[][] data, int element, int rowcount, int columncount){}

并拨打search2D(data,element,0,0);

答案 1 :(得分:0)

这是我认为应该做的一个版本。通常更好的设计不依赖于全局变量。

public Pair search2D(int[][] data, int element) {
    return search2D(0, 0, data, element);
}

public Pair search2D(int i, int j, int[][] data, int element) {
    if (i == data.length) {
        return new Pair(-1, -1);
    }
    if (j == data[i].length) {
        return search2D(i + 1, 0, data, element);
    }
    if (data[i][j] == element) {
        return new Pair(i, j);
    }
    return search2D(i, j + 1, data, element);
}

更新:我现在看到这可能不是您需要的帮助。您需要帮助才能使代码正常工作。但是使用它作为替代实现,它显示了递归的一些功能。 :)

答案 2 :(得分:0)

我没有考虑它的递归部分,但是在第一次搜索后没有重置rowCount和columnCount,你应该改变你的方法,使它们在开始时都是0。

public Pair search2D(int[][] data, int element) {
    return search2D(data, element, 0, 0);
}

public Pair search2D(int[][] data, int element, int rowCount, int columnCount) {
    //your method
}

此外,没有递归的方式可能更容易。

public Pair search2D(int[][] data, int element) {
    for(int row = 0; row < int.length; row++)
        for(int col = 0; col < int[].length; col++)
            if(data[row][col] == element) return new Pair(row, col);
    return new Pair(-1, -1);
}