这是java中的一个简单的递归问题。我一直在努力,但需要改进我的方法。
使用两个int参数m和n编写递归方法。前提条件要求0 <= m且m <= n。该方法打印一行m个星号,然后打印一行m + 1个星号,依此类推,直到一行n个星号。然后向后重复相同的模式:一行n个星号,然后是n-1,依此类推,直到n。实现中允许的唯一循环是打印一行m星号的循环。
这就是我所拥有的测试方法
package Recursion;
class Asterisk
{
public static void asterisk(int m, int n)
{
if (m == n)
{
printAsterisk(n);
return;
}
else if (m < n)
{
printAsterisk(m);
asterisk(m + 1, n);
}
else
{
printAsterisk(m);
asterisk(m - 1, m);
}
}
public static void printAsterisk(int m)
{
for (int i = 0; i < m; i++)
{
System.out.print("*");
}
System.out.println("");
}
public static void main(String[] args)
{
int m = 3;
int n = 5;
asterisk(m, n);
}
}
这样想:printAsterisk(6,5)什么都不打印。 printAsterisk(3,5)打印3个星号,然后插入printAsterisk(4,5),然后再打印3个星号。
预期产出
printAsterisk(3, 5)
***
****
*****
*****
****
***
我当前的输出
printAsterisk(3, 5)
***
****
*****
答案 0 :(得分:0)
这不是一个好的解决方案,你拥有它的方式会更好。为什么你只想用1种方法?
package Recursion;
class Asterisk
{
public static void asterisk(int m, int n)
{
if (m == n)
{
for (int i = 0; i < n; i++)
{
System.out.print("*");
}
System.out.println("");
}
else if (m < n)
{
for (int i = 0; i < m; i++)
{
System.out.print("*");
}
System.out.println("");
asterisk(m + 1, n);
}
else
{
for (int i = 0; i < m; i++)
{
System.out.print("*");
}
System.out.println("");
asterisk(m - 1, m);
}
}
public static void main(String[] args)
{
int m = 3;
int n = 5;
asterisk(m, n);
}
答案 1 :(得分:0)
这简单得多。
public static void asterisk(int m, int n) {
printAsterisk(m);
if (m < n) {
asterisk(m + 1, n);
}
printAsterisk(m);
}
只需在函数的开头和结尾打印m
星号。并且只有当m小于n
递归时才m + 1
。
如果m > n
执行此操作,则会阻止两条打印行:
public static void asterisk(int m, int n) {
if (m <= n) {
printAsterisk(m);
asterisk(m + 1, n);
printAsterisk(m);
}
}
答案 2 :(得分:0)
首先,这有点混乱。你的第一个方法中有一个返回语句,它是无效的,因此肯定不会运行。 但问题是你不应该首先使用void方法,因为你需要一个return语句来使它以递归方式工作,而不是从内部调用它。(写返回星号(m + 1, n)在&else; if if语句中,并在&#39; else&#39;内返回星号(m-1,n)。 然后,在main上写星号(m,n)就可以了。 对于任何语法问题,我很抱歉,我在平板电脑上写作