Подсчёт числа Трибоначчи

Почему при тестах показывается ошибка: 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;
        }
}
→ Ссылка