Нахождение n-го значения последовательности Рекамана с использованием лямбда-выражения - PullRequest
1 голос
/ 17 февраля 2020

Я изучаю потоковое API и у меня есть несколько вопросов. Я буду очень благодарен, если вы можете помочь. Мой код 1:

public long recaman(long n) {
    HashSet<Long> s = new HashSet<>();
    s.add(0L);
    long prev = 0;
    for (int i = 1; i < n; i++) {
        long curr = prev - i;
        if (curr < 0 || s.contains(curr)) {
            curr = prev + i;
        }
        s.add(curr);
        prev = curr;
    }
    return prev;
}

Мой код 2:

public int recaman(int n) {
    int[] seq = new int[n];
    boolean[] check = new boolean[10 * n];

    seq[0] = 0;
    check[0] = true;
    for (int k = 1; k < n; k++)
    {
        int minusVal = seq[k - 1] - k;
        int plusVal = seq[k - 1] + k;
        if ((minusVal > 0) && (!check[minusVal]))
        {
            seq[k] = minusVal;
            check[minusVal] = true;
        } else
        {
            seq[k] = plusVal;
            check[plusVal] = true;
        }
    }
    return seq[n - 1];   
}

Как переписать код с помощью лямбда-выражения (или использовать парадигму функционального программирования)?

1 Ответ

0 голосов
/ 17 февраля 2020

В обеих функциях вы перебираете переменную int (i в первой, k во второй)

В ваших циклах явно используется переменная итерации (в long curr = prev - i; и в int minusVal = seq[k - 1] - k;). Таким образом, это уже не «чистая» переменная итерации, а и переменная итерации и данные.

Одна из целей Streams - абстрагировать итерацию и покончить с переменными итерации. В лямбда-функции положение элемента в потоке недоступно. Таким образом, то, о чем вы просите, невозможно с Java Stream API.

Если вы все еще хотите использовать парадигму функционального программирования для решения этой проблемы, вам следует использовать рекурсию (ie. Потоки не подходят инструмент для вашей работы, рекурсия есть).

...