递归数字三角形

时间:2018-03-09 02:49:06

标签: java algorithm recursion

我在尝试将正确的数字放在正确的位置时遇到了麻烦,我的想法似乎是正确的,但打印不正确。

    static int plotTri1(int n, int i) {
    if (n > 0) {
        plotTri1(n - 1, n + i);
        i += n;
        for (; 0 < n; n--) {
            System.out.printf("%3d", (i--));
        }
        System.out.println();
    }
    return n;
}

我目前的解决方案打印出以下内容:

Given n = 5 and i = 0
  15
  14 13
  12 11 10
  9  8  7  6
  5  4  3  2  1

理想的解决方案是:

Given n = 5 and i = 0
  1
  3  2
  6  5  4
  10  9  8  7
  15 14 13 12 11

寻求帮助,使我找到理想的解决方案

3 个答案:

答案 0 :(得分:1)

为什么使用递归函数?

static void plotTri2(int n) {
    int k=1 ;
    for (int i=0; i<n; i++) {
        for (int j=0; j<=i; j++) {
            System.out.printf("%3d",  new Object[] {new Integer(k-j)} );
        }
        k+= i+2 ;
        System.out.println("");
    }
}

plotTri2(5);

答案 1 :(得分:0)

这是一种对我有用的方法。基本思路是以递归方式从每行中的起始编号向下打印该行中的最后一个编号。

public static void triangle(int n, int num) {
    if (n == 0) return;
    triangle(n - 1, num - n);
    System.out.println("\n");
    for (int i=0; i < n; ++i) {
        if (i > 0) System.out.print(" ");
        System.out.print(num - i);
    }
}

public static void main(String args[]) {
    triangle(5, 15);
}

enter image description here

Demo

答案 2 :(得分:0)

让前一个电话回复一下怎么样?这是一个想法:

static int[] f(int n){
    if (n == 0){
        int[] firstRange = new int[]{1,1};
        return firstRange;
    }

    int[] range = f(n - 1);

    for (int i=range[0]; i<=range[1]; i++) {
        System.out.printf("%3d", i);
    }
    System.out.println();

    int[] nextRange = new int[]{range[1] + 1, 2 * range[1] - range[0] + 2};
    return nextRange;
}