使用递归的n高度的Java三角形

假设一个名为makeLine的方法的可用性,该方法可以传递一个非负整数n和一个字符c,并返回一个由n个相同的字符组成的字符串,这些字符都等于c。 编写一个名为printTriangle的方法,它接收两个整数参数n和k。 如果n为负,则该方法不起作用。 如果n恰好是偶数,则将其值提高到下一个奇数(例如4 – > 5)。 然后,当k的值为零时,该方法打印一个O的SYMMETRIC三角形(大写字母O),如下所示:首先是一行n O,然后是一行n-2 O(缩进一个空格),然后是一行n-4 O(缩进两个空格),依此类推。 例如,如果方法收到5,0(或4,0),它将打印:

OOOOO OOO O 

注意:在上面的输出中,第一行包含第一个O之前的0个空格,下一个第1行空格,依此类推。

注意:这些指令说明当k为零时该方法的作用,但是程序员需要确定当k不为零时它的作用并将其用于您的优势。

该方法不得使用任何类型的循环(for,while,do-while)来完成其工作。 该方法应调用makeLine来完成创建不同长度的字符串的任务。

这就是我到目前为止所拥有的。 我在找出放置间距的位置时遇到了麻烦。 我相信它与k有关,但我不太确定。

 public void printTriangle(int n, int k){ if(n < 0) return; if(n % 2 == 0) n++; if(k == 0){ System.out.println(makeLine(n, 'O')); printTriangle(n-2, 0); } } 

我不会给你答案,但希望这会给你一些提示。 递归方法通过调用自身来解决同一问题的较小版本来解决问题。 在你的情况下,问题是打印这个(我把b放在空白所属的地方):

 OOOOO bOOO bbO 

您正在打印第一行,然后解决相同问题的较小版本,即打印较小的三角形:

 bOOO bbO 

问题是这个较小的版本并不完全相同; 它必须在每一行之前有额外的空格。 多少额外空间? 好吧,这就是导师说“使用k对你有利”的原因。 你如何递归地调用该方法,并使用k来告诉它显示额外的空格?

我有解决人们“家庭作业”的问题。 我会解释这是如何帮助你学习的。

以下是代码的工作原理。

首先,像你一样,你必须检查值n是否为奇数。 如果是,请按照您的方式增加值,使其均匀。

现在你需要建立你的“三角形”。 通过使用递归来完成此操作。 对于三角形的每一行,您需要打印空格,然后打印’O’,然后通过打印空格来结束行。

在您的示例中,’X代表空格,’O’代表三角形:

 OOOOO XOOOX XXOXX 

此外,看一个更大的例子:

 OOOOOOOOO XOOOOOOOX XXOOOOOXX XXXOOOXXX XXXXOXXXX 

如您所见,每次添加新行时,每侧都会添加一个额外的空格。 因此,您可以使用’k’来打印空间。 为每个递归执行添加1到’k’,将处理此问题。 现在您只需编辑System.out.println()语句即可添加makeLine以便绘制空格(或’X’)以及’O’。

 public void printTriangle(int n, int k){ if(n <= 0) return; if(n % 2 == 0) n++; System.out.println(makeLine(k, ' ') + makeLine(n, 'O') + makeLine(k, ' ')); printTriangle(n-2, k+1); } 

希望这可以帮助! 如果您有问题,请随时提问。