使用星号打印直角三角形向前和向后?

时间:2015-03-29 20:08:21

标签: java recursion

好的,这是一个家庭作业问题,在我解释这个问题之后,我会告诉你一个简单的问题。

示例:用户输入尺寸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 ();

2 个答案:

答案 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或更小);将打印*一次并且函数将结束:因此此时您将只有前三角形。