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 楼答案
在这两个函数中,您都在迭代一个
int
变量(第一个是i
,第二个是k
)循环显式地使用迭代变量(在
long curr = prev - i;
和int minusVal = seq[k - 1] - k;
)。因此,它不再是一个“纯粹”的迭代变量,而是一个迭代变量和数据Streams的目标之一是抽象迭代,并消除迭代变量。在lambda函数中,元素在流中的位置不可用。因此,Java流API不可能满足您的要求
如果你仍然想使用函数编程范例来解决这个问题,你应该使用递归(也就是说,流不是适合你工作的工具,递归才是)