无法弄清楚如何使方法递归

时间:2014-04-10 22:39:53

标签: java recursion

对于我的编程课程,我必须编写递归函数,但除了课程中给出的理论问题之外,我无法弄清楚如何使用自己的代码来完成。 如果有人能帮助我,并给我指示从哪里开始它就会很棒!

方法如下:

    public boolean hasColumn(Marble m) {
    boolean hasColumn = false;
    for (int i = 0; i < DIM && hasColumn == false; i++) {
        int winCount = 0;
        for (int j = 0; j < DIM && hasColumn == false; j++) {
            if (j == 0) {
                winCount = 1;
            } else {
                if (getField(j, i).equals(getField(j - 1, i))
                        && getField(j, i).equals(m)) {
                    winCount++;
                    if (winCount == WINLENGTH) {
                        hasColumn = true;
                    }
                } else {
                    winCount = 1;
                }
            }
            if (!(getField(j, i).equals(m))) {
                hasColumn = false;
            }
        }
    }

    return hasColumn;
   }

有一个[DIM] [DIM]字段,用于存储Marbles。大理石有一个标记,0-4,0为空,1-4为颜色值。该方法确定某人是否具有5的大理石列并获胜。 输入是玩家的Marble类型。输出为boolean hasColumn true或false。输出值是正确的,没有递归。

这个想法是让它以递归的方式找到一个垂直列。这也必须用水平/垂直方式来完成,但我想当我弄清楚这一点时,我会自己管理这些。

提前谢谢!

5 个答案:

答案 0 :(得分:1)

某些类型的递归和迭代之间存在二元性。

请考虑在迭代函数中使用两个变量ij对列进行迭代。你能将这些局部变量转换为函数的参数吗?您将把函数(局部变量)的内部状态转换为函数调用中隐含的状态。

答案 1 :(得分:1)

public boolean hasColumn(Marble m, int i, int j, int wincount) {
    if (wincount == WINLENGTH)
        return true;
    if (i == DIM)
        return false;
    if (j == DIM)
        return hasColumn(m, i + 1, 0, 0);
    return hasColumn(m, i, j + 1, getField(j, i).equals(m) ? wincount + 1 : 0);
}

根据您是否希望找到等于给定Marble元素的行/列,或者更确切地说相同的值,您可以调用此方法:

hasColumn(aMarble, 0, 0, 0);
hasColumn(getField(0, 0), 0, 0, 0);

答案 2 :(得分:1)

看起来像任务听起来像: 我们有一个方形矩阵的大理石元素(它可以是简单的整数),尺寸为DIM。 2.我们有一个方法getField(int,int)从这个矩阵返回一个大理石 3.我们有一个迭代决定来发现这个矩阵是否有任何具有相同大理石元素值的列

我们的目标是编写此方法的递归变体

答案 3 :(得分:1)

所以,看看这里。递归算法检查存在相同值的ROW:

public class Marble {
    public static final int DIM = 10;
    public int[][] marbleAr = new int[DIM][DIM];

    public void init(){
        for(int i=0;i<DIM;i++){
            for(int j=0;j<DIM;j++){
                marbleAr[i][j] = new Random().nextInt(10);
                if(i == 2){
                    marbleAr[i][j] = 7;
                }
            }
        }
    }

    public int get(int i, int j){
        return marbleAr[i][j];
    }

    public void printMarbleAr(){
        for(int i=0;i<DIM;i++){
            for(int j=0;j<DIM;j++){
                System.out.print(marbleAr[i][j] + "  ");
            }
            System.out.println();
        }
    }

    public boolean hasColumn(int val, int col, int row){
        if(row == 0){       
            return true;
        }
        if(this.hasColumn(val, col, row-1)){
            if(this.get(col, row) == this.get(col,row-1)){
                return true;
            }else{
                if(col == DIM-1){
                    return false;
                }
                return this.hasColumn(val, col+1, row);
            }           
        }
        return false;
    }

    public static void main(String[] args) {
        int v = 7;      
        Marble marble = new Marble();
        marble.init();
        marble.printMarbleAr();
        System.out.println(marble.hasColumn(v, 0, DIM-1));
    }
}

答案 4 :(得分:0)

  1. 您的方法名称为hasColumn并返回变量 名称是hasColumn那是不好的
  2. 我没有看到方法中再次实际调用hasColumn 下到递归路径。