该问题的基本思想是:
三角形数是算术级数的和,
即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
答案 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);
}
}