簡體   English   中英

需要幫助將迭代過程轉換為遞歸

[英]Need help converting iterative process to recursive

我正在嘗試轉換以下迭代代碼:

int rows = 3;

    for (int i = 0; i <= rows; i++) 
    {
        for (int j = 0; j < i; j++)
        {
            System.out.print("*");
        }

        for (int j = 0; j < rows-i; j++)
        {
            System.out.print("-");
        }


        System.out.println();
    }

輸出:

---
*--
**-
***

遞歸代碼。 這是一項任務。 我創建了迭代代碼,希望能夠弄清楚如何將其直接轉換為遞歸。 這是我的努力:

public void stringY(int star, int count){
        if (star > 0){
            System.out.print("*");
            stringY(star - 1, count);
        }
}

public void stringX(int dash,int count){
    if (dash == -1) {
        return;
    }else if (dash < count){
        System.out.print("-");
        stringX(dash - 1, count);
    } else if (dash == count){
        stringX(dash - 1, count);
    }
}


public void printPattern(int n) {
    if (n == -1){
        return;
    } else {
        printPattern(n-1);
        stringY(n, n);
        stringX(n, n);
        System.out.println();

    }

}

我在這里的問題是,盡管獲得了我所要尋找的關於模式“ *”部分的輸出,但我完全不知道如何獲得該模式的“-”部分。 現在,這是一項任務,我不需要任何解決方案,但是絕對歡迎朝着正確方向的任何指針。 我應該注意,我的兩個要求是:1)我必須不使用循環就完全完成分配; 2)我可以根據需要使用任意多個輔助方法,但是主調用方法(printPattern)必須保持公共空白,並且必須繼續只接受整數。 進一步說明:遞歸代碼塊中的其他兩個方法是我創建的輔助方法。

首先讓m =要打印的“ *”數,然后讓n =要打印的“-”數

對於每次遞歸,將m遞增1,並將n遞減1。

public static void main(String[] args) {
    printPattern(3);
}

public static void printPattern(int n) {
    printing(n, n);
}

//Variable size basically represent the number of columns
public static void printing(int n, int size) {
    //stop condition
    if(n == -1)
        return;

    //m is the number of * to print
    int m = size - n;
    printAsterisk(m);

    //n is the number of - to print
    printHyphen(n);

    System.out.println();

    printing(n - 1, size);
}

public static void printAsterisk(int m) {
    if(m == 0)
        return;
    System.out.print('*');
    printAsterisk(m - 1);
}

public static void printHyphen(int n) {
    if(n == 0)
        return;
    System.out.print('-');
    printHyphen(n - 1);
}

這樣想,它們都只是循環而已,在做一些工作。 從理論上講,您只需要一個遞歸函數即可自行調用,直到傳遞值為止。

void loop(int i, int till, Worker doThis) {
    if (i>=till) return;
    doThis.work(i);
    loop(i+1, till, doThis);
}

Worker只是一個界面,

public interface Worker {
    void work(int index);
}

現在我們需要通過需要完成的工作。 一共有三個循環,因此需要對loop函數進行三個調用。

final int rows = 3;
// outer loop
loop(0, rows+1, new Worker() {
    public void work(int index) {
        // Stars
        loop(0, index, new Worker() {
            public void work(int index) {
                System.out.print("*");
            }
        });
        // Dashes
        loop(0, rows-index, new Worker() {
            public void work(int index) {
                System.out.print("-");
            }
        });
        System.out.println();
    }
});

我先提取STARDASH

private static final String DASH = "-";
private static final String STAR = "*";

接下來,我將編寫一個方法以給定次數重復String 另外,我將使用StringBuilder (在這里,我已經遞歸完成了)

private static StringBuilder repeat(StringBuilder sb, String str, int n) {
    if (n > 0) {
        sb.append(str);
        repeat(sb, str, n - 1);
    }
    return sb;
}

接下來,一個私有的遞歸方法基於StringBuilder打印模式

private static void printPattern(StringBuilder sb, int s) {
    System.out.println(sb);
    int p = sb.indexOf(DASH, s);
    if (p > -1) {
        sb.replace(p, p + DASH.length(), STAR);
        printPattern(sb, s + STAR.length());
    }
}

最后是公共方法

public static void printPattern(int n) {
    printPattern(repeat(new StringBuilder(), DASH, n), 0);
}

暫無
暫無

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

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