Java 使用递归打印星号

Java 使用递归打印星号,java,recursion,Java,Recursion,有一个方法,printStars(j),可以返回一个字符串——一行j星号。我需要编写一个方法,递归地打印一个由n行星号组成的三角形。第一行需要有一个*,第二行需要有两个*s,等等。不能使用迭代循环(因此不能使用while、do-while或for) 向后执行此操作的代码非常简单: public void printTriangle(int n) { if(n >= 1) { printStars(n)); printTriangle(n - 1);

有一个方法,
printStars(j)
,可以返回一个字符串——一行
j
星号。我需要编写一个方法,递归地打印一个由
n
行星号组成的三角形。第一行需要有一个*,第二行需要有两个*s,等等。不能使用迭代循环(因此不能使用while、do-while或for)

向后执行此操作的代码非常简单:

public void printTriangle(int n) {
    if(n >= 1) {
        printStars(n));
        printTriangle(n - 1);
    }
}
到目前为止,我的代码用于上面的代码,但颠倒过来的代码如下。这是不正确的,因为在每个循环中,
i
被重置为1。我只是不知道该怎么办。我只能使用单参数函数

public void printTriangle(int n) {
    int i = 1;

    if(i <= n) {
        printStars(i);
        printTriangle(i + 1);
    }
}
public void printTriangle(int n){
int i=1;
如果(i)
这将确保
i
在调用函数之间保留其值。 它第一次被初始化为1,对变量所做的任何更改都将在调用期间保持不变

编辑:正如评论所说,这不是正确的方法。丹尼尔·菲舍尔的解决方案更好

这将确保
i
在调用函数之间保留其值。 它第一次被初始化为1,对变量所做的任何更改都将在调用期间保持不变


编辑:正如评论所说,这不是正确的方法。丹尼尔·菲舍尔的解决方案更好。

只需先重复,然后打印行:

public void printTriangle(int n) {
    if(n > 1) {
        printTriangle(n - 1);
    }
    System.out.println(makeStars(n));
}

因此,先打印较小的三角形,然后再添加较长的行。

只需先重复,然后打印行:

public void printTriangle(int n) {
    if(n > 1) {
        printTriangle(n - 1);
    }
    System.out.println(makeStars(n));
}

因此,首先打印较小的三角形,然后添加较长的行。

i
的最大值作为第二个参数传递,以限制要打印的行数,即
i
的最大值作为第二个参数传递
i
的最大值,以限制要打印的行数,即最大值
i

的最大值可能是一个双参数函数:

public void printTriangle(int i, int n) {
    if(i <= n) {
         System.out.println(printStars(i));
         printTriangle(i+1, n);
    }
}
public void printTriangle(int i,int n){

如果(i可能是一个双参数函数:

public void printTriangle(int i, int n) {
    if(i <= n) {
         System.out.println(printStars(i));
         printTriangle(i+1, n);
    }
}
public void printTriangle(int i,int n){

如果(对不起,我应该指定:我只能使用一个参数。对不起,我应该指定:我只能使用一个参数。这是正确打印三角形,但它在三角形前后都放置了一个额外的换行符,这被认为是不正确的。这是可以控制的,还是由makeStars
(我看不到也无法编辑)?事实上,第二部分的方法称为printStars,它实际上打印了整行。这就是我问这个问题的原因。我现在正在编辑我的文章。我从您的示例中获取了这个条件,您还可以打印一个额外的空行。将重复出现的条件更改为
if(I>1)
去掉前导的空行。@hotlick返回表示不同的意思,“再次诅咒”,不是吗?@DanielFischer--当然!这是正确打印三角形,但它在三角形前后都添加了一个额外的换行符,这被认为是不正确的。这是可以控制的,还是由
makeStars
处理的(我看不到或编辑)?事实上,第二部分的方法称为printStars,它实际上打印了整行。这就是为什么我要问这个问题。我现在正在编辑我的文章。我从你的示例中得到了这个条件,你还打印了一个额外的空行。将重复出现的条件更改为
if(I>1)
去掉前导的空行。@hotlick返回表示不同的意思,“再次诅咒”,不是吗?@DanielFischer--当然!我很抱歉没有指定:我只能使用一个参数。我已经相应地编辑了我的帖子。@StevenH这将是另一个选项。但是如果你只使用一个参数,Daniel Fischer就有了正确的答案。我很抱歉没有指定:我只能使用一个参数。我已经相应地编辑了我的帖子。@St即使这是另一种选择。但是如果你只使用一个参数,Daniel Fischer有一个正确的答案。通常,(通常在,例如,prolog中)你创建两个函数。一个作为“公共接口”,另一个做这项工作:pT_aux(int n,int i){…}pT(int n){pT_aux(n,1);}hthusuly,(通常在,例如,prolog中)您创建了两个函数,一个作为“公共接口”,另一个做这项工作:pT_aux(int n,int i){…}pT(int n){pT_aux(n,1);}hth