在功能上添加一个整数列表

时间:2012-11-28 19:14:27

标签: java recursion functional-programming

正如标题所说,我试图使用函数式编程范例添加整数列表。所以,根本没有变异。这是一个家庭作业,方法定义由我的教授设定,这也是我被卡住的部分原因,这是我到目前为止所做的:

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而无法访问构造函数。 我可能会以错误的方式解决这个问题,我试图想出一种方法来在列表中添加最后两个值,并将该总和放在新列表的最后一个位置,该列表是一个较短的索引。 如果你看到一个更好的方法来做到这一点或者可以推动我的答案,我会很感激,它的功课,所以不寻找完整的代码块。提前谢谢。

4 个答案:

答案 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,自动装箱在intInteger

之间平滑转换

答案 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());
     }
 }