在Java中使用递归打印*的模式

时间:2014-07-17 06:31:51

标签: java recursion

该程序应该读取文件中的数字列表,并使用递归方法基于读入的数字(一次一个)打印* s的模式。例如,如果读入的数字是4,则模式应如下所示:

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

但是,我的代码只打印此模式的上半部分。这是我的代码:

import java.util.Scanner; 
import java.io.*; 

public class Program3 {
    public static void main(String[] args) throws Exception {
        int num = 0;
        java.io.File file = new java.io.File("../instr/prog3.dat");
        Scanner fin = new Scanner(file);

        while(fin.hasNext()) {
            System.out.println("Please enter an integer");
                 num = fin.nextInt();
                 if(num >=0 && num <= 25) 
                makePattern(num);
        } 

    }

    public static void makePattern(int num) { 
        if(num >= 0 && num <= 25) {
        makePattern(num-1);
            for(int i = 0; i < num; i++) {
                System.out.print("*" + " ");
            }
            System.out.println(); 
        }
    }
}

以下是运行此程序时得到的输出:

Please enter an integer

*
* *
* * *
* * * *
Please enter an integer

*
* *
* * *
Please enter an integer

*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
Please enter an integer
Please enter an integer

它似乎正在正确读取文件,但我如何让它重复打印模式下半部分的步骤。另外,我怎样才能在main方法中修改我的循环以摆脱最后两个&#34;请输入一个整数&#34;声明?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

试着像这样想到它

每个模式都是

形式
pattern(#) = 
Some # of asterisks,
(the evaluation of pattern(# + 1))
Some # of asterisks

当然,这是缺少信息的关键部分,但它应该足以开始你递归思考。

----更新----

基本上,为了使递归成功,您需要找到一种方法来了解何时完成。这意味着递归函数遵循表单。

function = if (exit condition) {
  return value 
} else { 
  return some value computed from a call to function
}

关键是每次对该功能的后续调用都是&#34;更近&#34;比答案。例如,计算平方根的函数可能递归地返回每个数字(它只是一个例子),直到计算出所需的精度。

---编辑了另一次更新---

好的,我给你举个例子。它不是你真正应该使用的那个,但这就是重点。

考虑我有函数add(int, int)

我可以这样写

 int add(int a, int b) {
    return a + b;
 }

但这不会是递归的。递归执行此操作的一种方法是

 int add(int a, int b) {
   if (b == 0) {
     // exit condition, b is zero
     return a;
   } else if (b > 0) {
     // moving b closer to zero
     return add(a+1, b-1);
   } else {
     // b is negative, moving b closer to zero
     return add(a-1, b+1);
   }
 }

请注意,在这种情况下,对于add(3, 2),我会创建以下嵌套调用

 add(3,2) returns
 +add(4,1) which returns
  +add(5,0) which returns
   +5

或者换句话说,它会返回5,但只有在它自己调用三次之后(递归2次,一次达到退出条件)。

---最后更新和解决方案---

好的,所以你似乎缺乏真正理解我的意思的正确先决条件......这是你能得到完整答案的最接近的答案(来自我)

/*  @param thisRow the number of asterisks in the next row to be printed */
/*  @param needed the number of asterisks in the widest row of the diamond */
void printDiamond(int thisRow, int needed) {
  if (thisRow >= needed) {
    // the row has as many (or more) than we need.
    // terminate recursion.
    for (int i = 0; i < needed; i++) {
       System.out.print("*");
    }
  } else {
    // the row is less than what we need.
    // print out the row.
    for (int i = 0; i < thisRow; i++) {
       System.out.print("*");
    }
    // print out the middle
    printDiamond(thisRow+1, needed);
    // print out the row.
    for (int i = 0; i < thisRow; i++) {
       System.out.print("*");
    }
}

答案 1 :(得分:-1)

在打印*之前,您还没有考虑过需要插入的空格 使用嵌套: 第一行打印3个空格和1个星 第二行2个空格和2个星 等等...

答案 2 :(得分:-1)

像这样做

while(fin.hasNext()) {    
    num = fin.nextInt();
    if(num >0 && num <= 25) {
        System.out.println("Please enter an integer");
        makeUpperPattern(num);
        makeLowerPattern(num-1);
    }
}