Java 使用lambda表达式查找Recaman序列的第n个值
我正在学习流API,我有一些问题。如果你能帮忙,我将非常感激。 我的代码1: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.
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,我不认为这样做有什么好处。