这是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);
asterisk(n, m);
}
}
答案 0 :(得分:1)
所以,你需要这个:
printAsterisk(3, 5)
***
****
*****
*****
****
***
这样想:printAsterisk(6, 5)
什么都不打印。 printAsterisk(3, 5)
打印3
个星号,然后插入printAsterisk(4, 5)
,然后再次打印3
个星号。
答案 1 :(得分:0)
以下代码可以使用:
class Test {
public static void asterisk(int m, int n) {
if (m == n) {
printAsterisk(m);
return;
} else if (m < n) {
printAsterisk(m);
asterisk(m + 1, n);
} else {
printAsterisk(m);
asterisk(m - 1, n);
}
}
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);
asterisk(n, m);
}
}
请注意,这不是正确的方法。由于这个问题感觉像是一个任务,我不会发布准确的版本。现在,您的任务是将main方法中的两个调用移除到asterisk
,并修改该方法以使用单个调用。
答案 2 :(得分:0)
您的方法很好,您只需要考虑进入printAsterisk(int m, int n)
的内容。
递归函数通常可以被认为是解决可重复问题的一小部分,然后使用不同的参数将问题的其余部分委托给自己。
考虑以下输出(printAsterisk(4, 4);
):
****
如果我们想获得以下输出(printAsterisk(3, 4);
):
***
****
***
很容易看到此输出包含中间printAsterisk(4, 4);
的输出,因此当您调用printAsterisk(3, 4);
时,它应打印3个星号,调用printAsterisk(4,4);
然后打印剩余的3个星号。
如果你进一步扩展这个实现应该很容易看到。