有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用lambda表达式查找Recaman序列的第n个值

我正在学习流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];   
}

如何使用lambda表达式(或使用函数式编程范例)重写代码


共 (1) 个答案

  1. # 1 楼答案

    在这两个函数中,您都在迭代一个int变量(第一个是i,第二个是k

    循环显式地使用迭代变量(在long curr = prev - i;int minusVal = seq[k - 1] - k;)。因此,它不再是一个“纯粹”的迭代变量,而是一个迭代变量和数据

    Streams的目标之一是抽象迭代,并消除迭代变量。在lambda函数中,元素在流中的位置不可用。因此,Java流API不可能满足您的要求

    如果你仍然想使用函数编程范例来解决这个问题,你应该使用递归(也就是说,流不是适合你工作的工具,递归才是)