递归模式

时间:2014-07-16 20:08:45

标签: java recursion

我正在处理的程序应该从文件中读取输入并使用递归,为每个值打印星号模式,直到该值为< 0或> 25。

例如,如果值为4,则模式将如下所示

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

这些值存储在名为prog3.dat的文件中,该文件看起来像这样

4
3
15
26
0

我们应该在实际开始编码之前“计划”我们的程序,所以这就是我到目前为止我知道需要完成的工作。

1. Create scanner
2. Prompt for input
3. Open file
4. Store first number in variable
5. Figure out if pattern should be printed (if statement)
6. Print pattern

我也知道这里会有一个递归方法,但是我从来没有做过递归,也不知道如何去做。

我会尝试更具体地说明我需要帮助的内容。

1. Hoe would I go about reading the file one line at a time? 
2. How would I do the recursive method and recursion?

到目前为止,我已经能够提出这些问题,但我仍然遇到问题,我将按照代码进行展示。

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();
            //System.out.println(num);
            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
*

正如您所看到的,我不知道如何打印模式,就像我之前在问题中发布的示例一样。它似乎也没有正确读取文件。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

  

我如何一次读取一行文件?

我看到你正在使用扫描仪。如果文件的格式与您提供的格式相同,则在创建扫描仪对象后,您可以使用scannerobj.nextInt()来获取每个数字。

  

我如何进行递归方法和递归?

这是你用递归做的*打印部分。但我不认为我应该给你答案,因为它似乎是一个家庭作业问题。

答案 1 :(得分:1)

当任务需要多次完成时使用递归,但任务的每个实例都取决于该任务的较小实例的完成。

递归方法自称。它们通常看起来像这样:

public String[] recursion(String[] args) {
   //Use args to do some stuff

   //Make sure to check if the solution, given args, is trivial. Then we can
   //just return that.
   if (isTrivial) {
      return trivialAnswer;
   }

   //Otherwise, we keep going.
   //During this process args is changed in some way
   String[] newArgs = recursion(args);
   //Do more work with newArgs
   return newArgs;
}

这是一个更接近您的具体问题的大纲:

public String[] generatePattern(String[] args) {
   //Use args to figure out what smaller instance of your problem you can solve

   //You may find, given args, that the problem is already trivial.
   //For instance, what if value = 1? Then we only need to print out one star, right?
   //So let's just return that right now.
   if (args[POSITION_OF_VALUE_IN_ARGS] == 1) {
      return oneStar;
   }

   //If value > 1, we better keep going.
   //During this time args may change

   //Now find the solution to this smaller problem recursively and hold onto it
   //Maybe you should find the solution to the problem if value was actually 
   //(value - 1)?
   String[] smallerPattern = generatePattern(args);

   //Now use smallerPattern in this step to produce an answer that is one step
   //bigger.
   //So going with what I suggested in the last step: we now have a solution for
   //(value - 1). Use that to build the solution for a problem of size value.

   //Now return this solution. If we are already inside the recursion, this solution
   //will be the smallerPattern when it returns.
   return biggerPattern;
}

因此我们使用递归来解决您的问题。

免责声明:不要过于严格遵守上述大纲。我编写的代码很少,只关注你的实际问题;如果我得到你的确切问题,上面的许多部分都会改变。但是,我希望它提供足够的大纲来让一个人去,并解释递归可能如何发挥作用。

加分:为什么这个问题不应该使用递归
有几个人评论说这个问题不需要递归解决方案。原因如下:只有初始输入(值),才能预测和计算问题的任何步骤。因此,它可以通过迭代(for循环)来解决。

例如,如果value = 4,第5步是什么?它打印三颗星。您无需执行前面的四个步骤来解决这个问题。

我不是说这会诋毁分配这项任务的教授。他/她可能希望提出一个更简单的问题,以便学生在分配更困难的任务之前学习递归的基础知识。这项任务是否是向学生介绍递归的好方法超出了我的答案范围。相反,我想解释这些评论,说明你不想使用递归来解决“真实世界”中的这种问题。

答案 2 :(得分:-1)

你真的确定递归是必要的吗?我无法想象为什么人们应该使用递归,因为这个问题并不是真正的递归。你当然可以这样做。

我在这里提供了一些代码如何实现迭代

import java.util.Scanner;

public class MyClass {

    public static void generateFigure (int n) {
        for(int l = 0; l < n; l++) {
            for(int c = n-l-1; c >= 0; c--) {
                System.out.print(' ');
            }
            System.out.print('*');
            for(int c = 0; c < l; c++) {
                System.out.print(" *");
            }
            System.out.println();
        }
        for(int l = n-2; l >= 0; l--) {
            for(int c = n-l-1; c >= 0; c--) {
                System.out.print(' ');
            }
            System.out.print('*');
            for(int c = 0; c < l; c++) {
                System.out.print(" *");
            }
            System.out.println();
        }
    }


    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()) {
            int k = sc.nextInt();
            if(k > 0 && k <= 25) {
                generateFigure(k);
            }
        }
    }
}

或查看jdoodle

您当然可以重新设置三角绘画方法:

public static void generateUpperTriangle (int l, int n) {
    if(line < limit) {
        for(int c = n-l-1; c >= 0; c--) {
            System.out.print(' ');
        }
        System.out.print('*');
        for(int c = 0; c < l; c++) {
            System.out.print(" *");
        }
        System.out.println();
        generateUpperTriangle(l+1,n);
    }
}

public static void generateLowerTriangle (int l) {
    if(line >= 0) {
        for(int c = n-l-1; c >= 0; c--) {
            System.out.print(' ');
        }
        System.out.print('*');
        for(int c = 0; c < l; c++) {
            System.out.print(" *");
        }
        System.out.println();
        generateLowerTriangle(l-1);
    }
}

在这种情况下,generateFigure方法如下:

public static void generateFigure (int n) {
    generateUpperTriangle(0,n);
    generateLowerTriangle(n-1);
}