带递归的printStars方法

时间:2018-05-16 04:21:14

标签: java recursion

以下是我的指示: 写一个名为printStar(int n)递归方法,当n = 4时将打印以下内容:

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

这是我到目前为止所做的:

public class Stars{
   public static void main (String[] args){
      printStars(4);
   }

   public static void printStars(int count){
      if (count==0){
         System.out.println("");
      }
      else{
         System.out.print("*");
         printStars(count-1);
      }
   }
}

我的尝试只打印给定数量的星星中的一行。我不知道如何只用一次方法调用就可以打印多行。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

这个使用尾递归,分为辅助函数,并仅使用循环来获取所需的字符。

public class JavaR {
   public static void main(String[] args) {
        System.out.println(star(4, new StringBuilder()));
   }

  public static StringBuilder star(int times, StringBuilder builder) {
    return getStars(times, builder, times);
  }

  public static StringBuilder getStars(int currentIteration, StringBuilder builder, int times) {
      if (currentIteration < -1 * times) return builder;
      else if (currentIteration != 0) {
        builder.append(getNTimes(Math.abs(currentIteration)));
        return getStars(currentIteration - 1, builder, times);
      } else {
        return getStars(currentIteration - 1, builder, times);
      }
  }

  public static String getNTimes(int count) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < count; i++) {
        builder.append("*");
    }
    return builder.append("\n").toString();
  }
}

答案 1 :(得分:0)

您的程序不正确,请参阅以下程序并进行分析 -

optionsGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //do your stuff!
    }
});

解释 - 我使用两个while循环来打印星星,首先以asc顺序打印开始,然后以相反顺序打印。使用变量public class Stars{ public static void main (String[] args){ printStars(4); } public static void printStars(int count){ if (count==0){ // System.out.println(""); } else{ int tempCount = count; while(tempCount>0){ System.out.print("*"); tempCount--; } System.out.println(); printStars(count-1); while(tempCount<count){ System.out.print("*"); tempCount++; } System.out.println(); } } } 获取当前计数器。

答案 2 :(得分:0)

试试这个

public static void printStars(int count){
    if (count == 0){
        return;
    }
    printStarNTimes(count);
    printStars(count-1);
    printStarNTimes(count);
}
private static void printStarNTimes(int n) {
    for (int i = 0; i < n; i++) {
        System.out.print("*");
    }
    System.out.println();
}

逻辑是在当前调用中以及递归调用返回时打印星count次。

答案 3 :(得分:0)

该方法需要有关*的最大数量以及方向(*增加或减少的数量)的信息。 由于请求的方法签名只包含一个参数,因此您可以使用一些方法来定义其他所需信息:
使用thisthis答案中的部分递归方法,或使用辅助方法:

public static void printStars(int count){

    printStars(count, count, -1);
}

public static void printStars(int count , int max, int increment){

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

    count += increment;
    if(count ==0 ) { //lower limit reached 
        increment = -increment;
    }else {
        System.out.println(""); 
    }

    if (count > max){ //upper limit reached 
        return;
    }
    printStars(count, max, increment);
}