再帰は変数のスコープが分かりにくい

  static int[] loop(int[] a, int[] values) {
    int outer = 0;

    for (int inner = 0; inner < a.length; inner++)
      if (contains(values, a[inner]))
        a[outer++] = a[inner];

    return Arrays.copyOf(a, outer);
  }

  static int[] recursive(int[] a, int value) {
    return recursive(0, 0, a, value);
  }

  static int[] recursive(int outer, int inner, int[] a, int value) {
    if (inner >= a.length)
      return Arrays.copyOf(a, outer);

    if (a[inner] != value)
      a[outer++] = a[inner];

    return recursive(outer, inner + 1, a, value);
  }

  static boolean contains(int[] a, int value) {
    for (int i = 0; i < a.length; i++)
      if (a[i] == value)
        return true;
    return false;
  }