Pascal Triangle - 仅打印第n行

时间:2015-11-23 06:43:06

标签: java

这是输出Pascal三角形的一些代码,它显示了三角形的所有行。例如,如果用户输入为5,则输出如下:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

我只想让它输出最后一行。所以对于5,只有1 4 6 4 1.我很难完成这个,虽然这很容易,但我知道。任何帮助表示赞赏。

import java.util.Scanner;

public class PascalsTriangle {
    public static void computeRow(int n) {
       int counter;
       for (int i = 0; i < n; i++) {
           for (int j = 0; j <= i; j++) {
               System.out.print(pascalValue(i, j) + " ");
           }
           System.out.println();
        }
    }

    public static int pascalValue(int i, int j) {
        if (j == 0) {
            return 1;
        } else if (j == i) {
            return 1;
        } else {
            return pascalValue(i - 1, j - 1) + pascalValue(i - 1, j);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Which line number of Pascal's Triangle? ");
        int row = scanner.nextInt();
        System.out.print("Line " +row+" of Pascal's Triangle:\n");
        computeRow(row);
    }
}

2 个答案:

答案 0 :(得分:2)

更改您的computeRow()方法,以检查您要打印的三角形的特定线条。在您的情况下,您只想打印最后一行,这将在外部for循环的 last 迭代期间发生:

public static void computeRow(int n) {
    int counter;
    for (int i = 0; i < n; i++) {
        // only output the line if it be the last one
        if (i == n-1) {
            for (int j = 0; j <= i; j++) {
                System.out.print(pascalValue(i, j) + " ");
            }
            System.out.println();
        }
    }
}

public static void main(String[] args) {
    computeRow(5);
}

<强>输出:

Line 5 of Pascal's Triangle:
1 4 6 4 1

答案 1 :(得分:0)

为什么还要有外部for循环?内部循环仅在i = n-1时执行。因此,您可以锁定i的值,即行索引(n),并使用如下递归函数:

for (int j=0; j<=n; j++) {
   System.out.print(pascalValue(n, j) + " ");
}

顺便说一句,我不建议使用递归来找到给定索引处的Pascal值,而是使用它来建立行索引n,并使用for循环将Pascal值填充到一行。这样,您也可以使用动态编程并防止重叠。这就是JavaScript所需要的。

var getRow = function(rowIndex) {
    if (rowIndex == 0) {
      return [1];
    }
    else {
        var row = [1];
        previousLine = getRow(rowIndex - 1);
        for (let i = 0; i < previousLine.length - 1; i++) {
          row.push(previousLine[i] + previousLine[i + 1]);
        }
        row.push(1);
    } 
    return row;
};