好的,这是一个家庭作业问题,在我解释这个问题之后,我会告诉你一个简单的问题。
示例:用户输入尺寸4。最长的行包含四个" *"
编写一个递归方法printPattern,它将向前和向后打印图案。该方法应该有一个参数n,它指定模式中最长行的长度。如果n小于1,则该方法不应打印任何内容。
这是我的计划:
import java.awt.*;
import hsa.Console;
public class PrintPattern_RichardZhang
{
static Console c; // The output console
public static void main (String[] args)
{
c = new Console ();
int x;
c.println ("Please enter the largest line: ");
x = c.readInt ();
//calling the method printPattern
printPattern (x);
} // main method
//method for printing the pattern
public static void printPattern (int x)
{
if (x > 1)
{
for (int i = 0 ; i < x ; i++)
{
c.print ("*");
}
c.println ();
printPattern (x - 1);
}
for (int i = 0 ; i < x ; i++) //Print on the way back
{
c.print ("*");
}
c.println ();
}
} // PrintPattern_RichardZhang class
我似乎不明白为什么每次打印都会产生x ++。甚至认为这是正确的xD。这是我的问题。
(int i = 0 ; i < x ; i++) //Print on the way back
{
c.print ("*");
}
c.println ();
答案 0 :(得分:1)
你的逻辑是正确的。但是我会明确地写出退出条件。对于你的问题:在回来的路上,它实际上并没有增加x。例如,当x = 4时,调用函数并打印4个星,然后再次调用函数x = 3.但是这不再是x,因为x是每个函数调用的新局部变量。因此,当您为x = 3调用函数时,先前的x(即4)将保留在内存(堆栈)中以供稍后使用,并且在调用并分配给3的新函数中创建新变量x。这一直持续到为x = 0调用该函数。此时在内存中有5个名为x的变量,它们的值分别为4,3,2,1,0,它们都是调用函数的局部变量。当递归在x = 0处停止时,暂停的函数调用用它们各自的本地x变量触发,它们分别是1,2,3,4。因此,x实际上不会增加。来自内存的x值以与被调用的递归函数相反的顺序使用。内存就像递归中的堆栈一样!我希望有所帮助。祝你好运!
答案 1 :(得分:0)
只需浏览脑海中的代码,您就会发现问题所在:
想象一下用X
为3调用此函数。
首先介绍一下你的功能:
X > 1
,条件已满足,因此在一行上打印*
3次,并使用参数2再次调用该函数,X
仍大于1,因此我们打印现在*
两次并再次调用该函数。
第三次调用该函数;现在X
是1,所以条件不满足,第二个for语句(记录不应该是循环,因为X
在达到此行时总是为1或更小);将打印*
一次并且函数将结束:因此此时您将只有前三角形。