簡體   English   中英

無法弄清楚如何使方法遞歸

[英]Can't figure out how to make method recursive

在我的編程課程中,我必須編寫遞歸函數,但是除了在課堂上給出的理論性問題之外,我無法弄清楚如何用自己的代碼來實現。 如果有人可以幫助我,並為我提供從哪里開始的指導,那就太好了!

方法如下:

    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],用於存儲大理石。 大理石有一個標記,它是0-4,其中0為空,而1-4為顏色值。 該方法確定某人是否有5的大理石柱並獲勝。 輸入是玩家的大理石類型。 輸出為boolean hasColumn true或false。 輸出值正確,沒有遞歸。

這個想法是讓它以遞歸的方式找到一個垂直列。 這也必須在水平/垂直方向上完成,但是當我弄清楚了這個問題后,我會自行處理。

先感謝您!

某些類型的遞歸和迭代之間存在雙重性。

考慮在迭代函數中,您使用兩個變量ij在列上進行迭代。 您可以將這些局部變量轉換為函數的參數嗎? 您將把函數內部的狀態(局部變量)轉換為函數調用中隱含的狀態。

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);

任務聽起來像:1.我們有一個尺寸為DIM的大理石元素方陣(可以是簡單整數)。 2.我們有一個方法getField(int,int)從此矩陣返回大理石。3.我們有一個迭代決策,以確定此矩陣是否有任何具有相等大理石元素值的列。

我們的目標是此方法的寫遞歸變體

所以,看這里。 遞歸算法檢查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));
    }
}
  1. 您的方法名稱為hasColumn ,返回變量名稱為hasColumn 那是壞的
  2. 我看不到hasColumn再次在方法內部被調用而實際上進入了遞歸路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM