Подсчёт числа Трибоначчи
Почему при тестах показывается ошибка: Index 1 out of bounds for length 1. Как будет правильным посчитать при n == 2? Мне нужно задать цикл, но это сделать ведь не могу, потому что счётчик в цикле должен быть минимум 3, чтобы перебрать элементы.
Вот так выглядит чужой код.
Сами тесты:
Testing for signature: [0.0, 7.0, 16.0] and n: 48
Testing for signature: [5.0, 13.0, 14.0] and n: 47
Testing for signature: [1.0, 7.0, 7.0] and n: 45
Testing for signature: [10.0, 18.0, 7.0] and n: 34
Testing for signature: [0.0, 16.0, 19.0] and n: 37
Testing for signature: [2.0, 0.0, 3.0] and n: 17
Testing for signature: [16.0, 3.0, 10.0] and n: 44
Testing for signature: [13.0, 8.0, 4.0] and n: 17
Testing for signature: [5.0, 8.0, 4.0] and n: 4
Testing for signature: [7.0, 12.0, 6.0] and n: 46
Testing for signature: [4.0, 17.0, 3.0] and n: 41
Testing for signature: [0.0, 12.0, 7.0] and n: 22
Testing for signature: [5.0, 4.0, 0.0] and n: 36
Testing for signature: [7.0, 20.0, 14.0] and n: 36
Testing for signature: [12.0, 16.0, 14.0] and n: 28
Testing for signature: [13.0, 5.0, 3.0] and n: 22
Testing for signature: [3.0, 4.0, 20.0] and n: 49
Testing for signature: [14.0, 6.0, 16.0] and n: 26
Testing for signature: [4.0, 18.0, 5.0] and n: 6
Testing for signature: [10.0, 5.0, 20.0] and n: 11
Testing for signature: [6.0, 8.0, 13.0] and n: 15
Testing for signature: [15.0, 14.0, 14.0] and n: 12
Testing for signature: [7.0, 19.0, 16.0] and n: 18
Testing for signature: [5.0, 8.0, 2.0] and n: 30
Testing for signature: [6.0, 7.0, 2.0] and n: 17
Testing for signature: [17.0, 5.0, 7.0] and n: 45
Testing for signature: [14.0, 17.0, 5.0] and n: 28
Testing for signature: [5.0, 5.0, 2.0] and n: 17
Testing for signature: [0.0, 2.0, 17.0] and n: 49
Testing for signature: [18.0, 17.0, 8.0] and n: 6
Testing for signature: [15.0, 15.0, 19.0] and n: 4
Testing for signature: [11.0, 17.0, 17.0] and n: 20
Testing for signature: [2.0, 20.0, 6.0] and n: 17
Testing for signature: [4.0, 1.0, 2.0] and n: 45
Testing for signature: [2.0, 16.0, 5.0] and n: 21
Testing for signature: [4.0, 13.0, 18.0] and n: 6
Testing for signature: [18.0, 11.0, 3.0] and n: 30
Testing for signature: [13.0, 3.0, 15.0] and n: 8
Testing for signature: [20.0, 2.0, 7.0] and n: 1
Код:
public class Main {
private double precision = 1e-10;
@Test
public void basicTests() {
assertArrayEquals(new double []{1,1,1,3,5,9,17,31,57,105}, tribonacci(new double []{1,1,1},4), precision);
assertArrayEquals(new double []{0,0,1,1,2,4,7,13,24,44}, tribonacci(new double []{0,0,1},10), precision);
assertArrayEquals(new double []{0,1,1,2,4,7,13,24,44,81}, tribonacci(new double []{0,1,1},10), precision);
}
public static double[] tribonacci(double[] s, int n) {
double[] f = new double [n];
double[] t = new double [1];
for (int i = 0; i < s.length; i++) {
f[i] = s[i];
}
if (n == 1) {
t[0] = s[0];
return t;
}
if (n == 2) {
t[0] = s[1];
return t;
}
if (n == 0) {
return new double[0];
}
for (int i = 3; i < n; i++) {
f[i] = f[i - 3] + f[i - 2] + f[i - 1];
}
return f;
}
}
Ответы (2 шт):
Автор решения: MBo
→ Ссылка
Для аргумента меньше 3 просто верните часть исходного массива до соотв. индекса
Вместо всего этого
for (int i = 0; i < s.length; i++) {
f[i] = s[i];
}
if (n == 1) {
t[0] = s[0];
return t;
}
if (n == 2) {
t[0] = s[1];
return t;
}
if (n == 0) {
return new double[0];
}
оставьте
for (int i = 0; i < s.length && i < n; i++) {
f[i] = s[i];
}
if (n < 3) {
return f;
}
Автор решения: Blacit
→ Ссылка
Рабочий код, который прошёл все тесты.
public class Main {
private double precision = 1e-10;
@Test
public void basicTests() {
assertArrayEquals(new double []{1,1,1,3,5,9,17,31,57,105}, tribonacci(new double []{1,1,1},10), precision);
assertArrayEquals(new double []{0,0,1,1,2,4,7,13,24,44}, tribonacci(new double []{0,0,1},10), precision);
assertArrayEquals(new double []{0,1,1,2,4,7,13,24,44,81}, tribonacci(new double []{0,1,1},10), precision);
assertArrayEquals(new double []{}, tribonacci(new double []{0,1,1},0)); // прошло
assertArrayEquals(new double []{0}, tribonacci(new double []{0,1,1},1));
assertArrayEquals(new double []{0,1}, tribonacci(new double []{0,1,1},2));
assertArrayEquals(new double []{0,1,1}, tribonacci(new double []{0,1,1},3));
assertArrayEquals(new double []{0,0.5,1,1.5}, tribonacci(new double []{0,0.5,1},4));
}
public static double[] tribonacci(double[] s, int n) {
double[] f = new double [n];
double[] t = new double [1];
if (n == 1) {
t[0] = s[0];
return t;
}
if (n == 2) {
t = new double [2];
t[0] = s[0];
t[1] = s[1];
return t;
}
if (n == 0) {
return new double[0];
}
for (int i = 0; i < s.length; i++) {
f[i] = s[i];
}
for (int i = 3; i < n; i++) {
f[i] = f[i - 3] + f[i - 2] + f[i - 1];
}
return f;
}
}
Либо
public class Main {
private double precision = 1e-10;
@Test
public void basicTests() {
assertArrayEquals(new double []{1,1,1,3,5,9,17,31,57,105}, tribonacci(new double []{1,1,1},10), precision);
assertArrayEquals(new double []{0,0,1,1,2,4,7,13,24,44}, tribonacci(new double []{0,0,1},10), precision);
assertArrayEquals(new double []{0,1,1,2,4,7,13,24,44,81}, tribonacci(new double []{0,1,1},10), precision);
assertArrayEquals(new double []{}, tribonacci(new double []{0,1,1},0)); // прошло
assertArrayEquals(new double []{0}, tribonacci(new double []{0,1,1},1));
assertArrayEquals(new double []{0,1}, tribonacci(new double []{0,1,1},2));
assertArrayEquals(new double []{0,1,1}, tribonacci(new double []{0,1,1},3));
assertArrayEquals(new double []{0,0.5,1,1.5}, tribonacci(new double []{0,0.5,1},4));
}
public static double[] tribonacci(double[] s, int n) {
double[] f = new double [n];
double[] t = new double [1];
for (int i = 0; i < s.length && i < n; i++) {
f[i] = s[i];
}
if (n < 3) {
return f;
}
for (int i = 3; i < n; i++) {
f[i] = f[i - 3] + f[i - 2] + f[i - 1];
}
return f;
}
}