1

正如标题所说,我正在尝试使用函数式编程范式添加一个整数列表。所以,根本没有突变。这是一个家庭作业,我的教授已经设置了方法定义,这就是我被卡住的部分原因,这就是我到目前为止所拥有的:

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

4 回答 4

4

您的else分支应包含列表中的第一个数字。此外,您应该在对 . 的调用中修复第二个参数List.sublist。的两个参数List.sublist(fromIndex, toIndex)指定一个子列表。fromIndex包含但toIndex排他。

于 2012-11-28T19:16:33.753 回答
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;
}

仅供参考,自动装箱在int和之间平滑转换Integer

于 2012-11-28T19:19:18.053 回答
0

您的原始答案非常接近。

提示:你得到一个由原始列表减去最后一个元素组成的子列表,但你只是把最后一个元素扔掉——你永远不会使用它的值。也许它应该包含在子列表的总和中?(答案=是)

另外,我可能会在方法的顶部投入:

if (values == null || values.isEmpty())
{
  return null;
}
于 2012-11-28T19:34:48.477 回答
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());
     }
 }
于 2012-11-29T13:43:54.943 回答