正如标题所说,我试图使用函数式编程范例添加整数列表。所以,根本没有变异。这是一个家庭作业,方法定义由我的教授设定,这也是我被卡住的部分原因,这是我到目前为止所做的:
public static Integer sum(final List<Integer> values) {
if(values.size() == 1) {
return values.get(0);
}
else {
List<Integer> tempList;
tempList = values.subList(0, values.size() - 1);
return sum(tempList);
}
}
我只能返回一个List,并且在创建后不能以任何方式修改它,并且由于使用了通用List而无法访问构造函数。 我可能会以错误的方式解决这个问题,我试图想出一种方法来在列表中添加最后两个值,并将该总和放在新列表的最后一个位置,该列表是一个较短的索引。 如果你看到一个更好的方法来做到这一点或者可以推动我的答案,我会很感激,它的功课,所以不寻找完整的代码块。提前谢谢。
答案 0 :(得分:4)
您的else
分支应包含列表中的第一个数字。此外,您应该在调用List.sublist
时修复第二个参数。 List.sublist(fromIndex, toIndex)
的两个参数指定子列表。 fromIndex
包含toIndex
,但{{1}}是独占的。
答案 1 :(得分:1)
哦,我明白了 - 你想要一个递归解决方案。试试这个单行,在技术上甚至不使用if
语句:
public static Integer sum(final List<Integer> values) {
return values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}
这可能会让你获得9/10的分数。要获得满分,您需要添加null安全性:
public static Integer sum(final List<Integer> values) {
return values == null || values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}
完全披露,之前我有过:
你的代码太多了!
public static Integer sum(final List<Integer> values) {
int total = 0;
for (int i : values) {
total += i;
}
return total;
}
fyi,自动装箱在int
和Integer
答案 2 :(得分:0)
您的原始答案非常接近。
提示:你得到的是一个由原始列表减去最后一个元素组成的子列表,但你只是扔掉了最后一个元素 - 你永远不会使用它的值。也许它应该包含在子列表的总和中? (回答=是)
另外,我可能会抛出方法的顶部:
if (values == null || values.isEmpty())
{
return null;
}
答案 3 :(得分:0)
在Haskell中添加一个列表,以此来查看明显的解决方案。 sum是一个加法的折叠器:
sum xs = foldr (+) 0 xs
内联折叠器
sum xs = go (+) 0 xs
where
go _ z [] = z
go f z (x:xs) = f x (go f z xs)
专攻(+)
sum xs = go xs
where
go [] = 0
go (x:xs) = x + (go xs)
内联去获得我们的最终答案:
sum [] = 0
sum (x:xs) = x + sum xs
这是基本的递归解决方案。对于包含一个或多个元素的空列表或列表,它也可以正常工作。你可以直接将它翻译成Java(我的Java非常生疏):
public static Integer sum(final List<Integer> xs) {
if(xs.size() == 0) {
return 0;
} else {
return xs.get(0) + sum(subList(1, xs.size());
}
}