该程序应该读取文件中的数字列表,并使用递归方法基于读入的数字(一次一个)打印* 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;声明?任何帮助将不胜感激。
答案 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);
}
}