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

时间:2014-11-28 04:48:11

标签: java

  

假设一个名为makeLine的方法的可用性,该方法可以传递一个非负整数n和一个字符c,并返回一个由n个相同的字符组成的字符串,这些字符都等于c。编写一个名为printTriangle的方法,该方法接收两个整数参数n和k。如果n为负,则该方法不执行任何操作。如果n碰巧是偶数,则将其值提高到下一个奇数(例如4 - > 5)。然后,当k的值为零时,该方法按如下方式打印O的SYMMETRIC三角形(大写字母O):首先是一行n O,然后是一行n-2 O' s (缩进一个空格),然后是一行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); 
    } 
}

2 个答案:

答案 0 :(得分:1)

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

OOOOO
bOOO
bbO

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

bOOO
bbO

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

答案 1 :(得分:0)

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

以下是代码的工作原理。

首先,与您一样,您必须检查值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); 
}

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