Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用lambda表达式查找Recaman序列的第n个值_Java_Java Stream - Fatal编程技术网

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

Java 使用lambda表达式查找Recaman序列的第n个值,java,java-stream,Java,Java Stream,我正在学习流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.

我正在学习流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;
}
public long-recaman(长n){
HashSet s=新的HashSet();
s、 添加(0升);
长期预测=0;
对于(int i=1;i
我的代码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];   
}
public int recaman(int n){
int[]seq=新的int[n];
布尔[]检查=新布尔[10*n];
seq[0]=0;
检查[0]=true;
对于(int k=1;k0)&(!检查[minusVal]))
{
seq[k]=最小值;
检查[最小值]=真;
}否则
{
seq[k]=plusVal;
检查[plusVal]=true;
}
}
返回序列[n-1];
}

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

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

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

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


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

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

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

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


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

您当前的实现看起来不错。请保留它。您是否可以在这里插入上面的方法体*/}。虽然作为@RavindraRanwala,我不认为这样做有什么好处。您当前的实现看起来不错。请保留它。您是否可以在这里插入上面的方法体*/}。尽管作为@RavindraRanwala,我不认为这样做有什么好处。