编写三角形数(算术级数之和),而无需使用迭代

时间:2019-06-12 06:19:43

标签: java

该问题的基本思想是:

三角形数是算术级数的和, 即1,3,6,10,15..etc. (以1+0,1+2,1+2+3, 1+2+3+4, 1+2+3+4+5... etc到达)

我已经使用迭代对以下问题进行了编码,如果没有迭代该如何解决?

public class Test {
    static int triangle(int n) {
    int total = 0;
    for (int index = 0; index < n + 1; index++) {
        total = total + index;
    }
    return total;
}
public static void main(String args[]) {
    for (int x = 1; x < 6; x++)
        System.out.println(triangle(x));
    }
}

输出正确,但是我想要一个比我写的更好的解决方案。

O / P:

1
3
6
10
15

6 个答案:

答案 0 :(得分:2)

使用递归的解决方案:

public static void triangular(int start, int n){
    if(start > n)
        return;
    int triangular = (start*(start+1))/2;
    System.out.println(triangular);
    triangular(start+1,n);
}

用法:

public static void main(String[] args) throws IOException {
    int n = 5;
    triangular(1,n);
}
  

输出:1 3 6 10 15

任何数字n的三角数是= (n*(n+1))/2。因此对于n = 5,其三角数为15。使用此公式,我应用了递归。

答案 1 :(得分:1)

您可以利用的另一件事是,序列中的每个数字i是序列1...i中数字的总和。

因此,可以使用n(n+1)/2计算序列中的每个数字。因此:

static int triangle(int n) {
    return (n * (n + 1)) / 2;
}

您就可以使用此简单的int流(如果需要,请使用循环):

IntStream.range(1, 10).map(Main::sumAt).forEachOrdered(System.out::println);

哪个输出(您只需选择int流停止的位置)

1
3
6
10
15
21
28
36
45

答案 2 :(得分:0)

您可以通过递归替换迭代

public class Test {
 static int triangle(int n) {
  return n <= 1 ? 1 : n+triangle(n-1);
 }
}

但这对表演不会更好 如果目标是提高性能,对不起,但我们需要使用地球上最晦涩的力量,即数学!!!

答案 3 :(得分:0)

考虑这个问题的一种方法是:

  

要计算第n个三角数,首先需要计算第(n-1)个三角数。然后将n添加到该数字。另外,第一个三角数是1。

现在您只需将其放入代码中,就可以完成:

static int triangle(int n) {
    if (n == 1) {
        return 1;
    }
    return n + triangle(n - 1);
}

或者,第n个三角数也是算术序列1,2,3,4,5的前n个项的总和...这意味着我们可以将公式用于的第n个三角形的总和也可以解决该问题的算术序列。

n * (2 * a + (n - 1) * d) / 2

将公共差d替换为1,将第一项a替换为1,我们得到

n * (n + 1) / 2

所以我们可以将方法编写为:

static int triangle(int n) {
    return n * (n + 1) / 2;
}

答案 4 :(得分:0)

保留先前的总和并添加到当前数字

  public static void main(String[] args) {
            int tNumber = 0;
            for (int i = 1; i <=10 ; i++) {
                tNumber=tNumber+i;
                System.out.print(" "+tNumber);
            }

输出:

 1 3 6 10 15 21 28 36 45 55

答案 5 :(得分:0)

没有循环或递归,不可避免地无法获得序列。但是,计算序列中的一个元素可以有/没有它。

有很多公式可以实现。以下代码涉及递归和无迭代解决方案。

class Sol {
    public static void main(String[] args) {
        System.out.println(f(5));
        System.out.println(f2(5));
    }

    public static int f(int n) {
        return (int)(n - Math.floor(n/2) +
                Math.floor(n*n/2));
    }

    public static int f2(int n) {
        if (n <= 0)
            return 0;
        if (n <= 1)
            return 1;

        return 3* f2(n-1) - 3* f2(n-2) + f2(n-3);
    }
}