[英]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();
}
});
我先提取STAR
和DASH
,
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.