3

我正在研究应该是一个相对简单的 java 递归问题,尽管我似乎无法在任何地方找到一个简单的、单一方法的解决方案。

我正在尝试按降序打印星号,然后按升序打印,这样当用户输入 3 时,打印输出将如下所示:

*
**
***
**
*

编辑:感谢@dasblinkenlight 的帮助,这已经演变为:

public void patternMaker(int start, int max, int direction){
    if(start == 0){
        return;
    }
    for(int i = 0; i < start; i++){
        System.out.print("*");
    }
    System.out.println();
    if(start == max){
        direction = -1;
    }
    patternMaker(start + direction, max, direction);

现在,它以正确的顺序打印正确数量的星号:

*
**
***
**
*

感谢大家的帮助!

4

4 回答 4

4

我不确定您是否可以使用一个参数进行递归。我想你需要两个。这是想法:

stars(2, 4)

会打印

**
***
****
***
**

stars(5, 6)

会打印

*****
******
*****

这自然是递归的。为什么?因为

stars(n, n)

只打印 n 颗星。这是基本情况。现在递归步骤怎么样?好吧,让我们试试

stars(k, n)

其中 k < n。这样做是这样的

draw a line of k stars
call stars(k + 1, n)
draw a line of k stars

就这些。当然,检查 k < n 是很好的,但我们相信您可以解决这个问题。

于 2012-07-26T04:25:53.407 回答
3

你需要另一个参数来告诉你你要去哪条路。您还需要测试结束条件以了解何时从上升切换到下降。

public void patternMaker(int x, int direction){
    // Direction is either +1 or -1, depending on whether you go up or down
    // at the moment. Once you reach 3, switch the sign;
    // Once you reach zero, stop.

    // Pseudocode:
    // If x is zero, we're done
    // Print x asterisks followed by newline
    // if x == 3, make direction -1
    // Perform the recursive call with (x+direction, direction)
}

在递归之前绘制星星可能会更容易,尽管这两种方式都是可能的。

于 2012-07-26T04:15:45.347 回答
1
static String patternMaker(int x, String result){
    String curStr ="";
    for (int i=0; i<x; i++)
        curStr += "*";
    curStr += "\n";
    if (result == null){             
         return patternMaker(x-1,curStr);
    }else if (x > 0){           
          return patternMaker(x-1, curStr+result+curStr); 
    }
    else 
        return result;
}

//test with :
System.out.println(patternMaker(3,null));
于 2012-07-26T04:40:09.177 回答
-1
public class pattern {

public void patternMaker(int x){
    if(x > 0){
        for(int i = 0; i < x; i++){
            for(int j=0;j<=i;j++){
                System.out.print("*");
            }
            System.out.print("\n");
        }
        for(int i = x-1; i > 0; i--){
            for(int j=i;j>0;j--){
                System.out.print("*");
            }
            System.out.print("\n");
        }
    }
}
public static void main(String[] ar){
    new pattern().patternMaker(3);
}
}
于 2012-07-26T04:59:57.340 回答