Java 功能性地添加整数列表

Java 功能性地添加整数列表,java,recursion,functional-programming,Java,Recursion,Functional Programming,正如标题所说,我试图使用函数式编程范式添加一个整数列表。所以,根本没有突变。这是一个家庭作业,方法定义是由我的教授设定的,这也是我被困的部分原因,这就是我迄今为止所做的: public static Integer sum(final List<Integer> values) { if(values.size() == 1) { return values.get(0); } else { List&

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

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);
     }
 }
我只能返回一个列表,在创建后不能以任何方式修改它,并且由于使用的是泛型列表,因此无法访问构造函数。 我可能用了错误的方法,我在想一种方法,将列表中的最后两个值相加,然后将总和放在一个新列表的最后一个位置,这个新列表的索引要短一个。 如果你能找到一个更好的方法来做这件事,或者能把我推向答案,我将不胜感激,因为这是一个家庭作业,所以不需要寻找完整的代码块。提前谢谢。

您的else分支机构应该在列表中包含第一个数字。此外,您应该修复调用List.sublist中的第二个参数。List.sublistfromIndex和toIndex的两个参数指定了一个子列表。fromIndex包含在内,但toIndex是独占的。

您的else分支应包含列表中的第一个数字。此外,您应该修复调用List.sublist中的第二个参数。List.sublistfromIndex和toIndex的两个参数指定了一个子列表。fromIndex包含在内,但toIndex是独占的。

编辑: 哦,我明白了-你想要一个递归的解决方案。试试这个单行程序,它在技术上甚至不使用if语句:

public static Integer sum(final List<Integer> values) {
     return values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}
这可能会让你得到9/10的分数。对于满分,您需要添加空安全性:

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之间平滑转换

编辑: 哦,我明白了-你想要一个递归的解决方案。试试这个单行程序,它在技术上甚至不使用if语句:

public static Integer sum(final List<Integer> values) {
     return values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}
这可能会让你得到9/10的分数。对于满分,您需要添加空安全性:

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之间平滑转换

您的原始答案非常接近

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

此外,我可能会在方法的顶部加入:

if (values == null || values.isEmpty())
{
  return null;
}

你原来的答案很接近

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

此外,我可能会在方法的顶部加入:

if (values == null || values.isEmpty())
{
  return null;
}

在Haskell中添加列表,以查看明显的解决方案。sum是一个带加法的foldr:

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

在Haskell中添加列表,以查看明显的解决方案。sum是一个带加法的foldr:

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

他不是说他不是在寻找一个完整的代码块吗+很好的提示。我唯一的意见是,第一个数字与他已有的代码不太一致,应该是最后一个。复制,在你编辑代码之前,我看了你的代码大约2秒钟。两个问题:sumlist是做什么的?您能否更具体地说明我的子列表有什么问题?谢谢。@JakeSellers如果你真的想看他的代码,他的答案的完整修订历史记录在这里:啊,谢谢,但我还是想了解他在做什么,而不是只是复制粘贴。他不是说他不是在寻找完整的代码块吗+很好的提示。我唯一的意见是,第一个数字与他已有的代码不太一致,应该是最后一个。复制,在你编辑代码之前,我看了你的代码大约2秒钟。两个问题:sumlist是做什么的?您能否更具体地说明我的子列表有什么问题?谢谢。@JakeSellers如果你真的想看他的代码,他的答案的完整修订历史记录在这里:啊,谢谢,但我还是想了解他在做什么,而不是只是复制粘贴。你必须使用递归吗?如果没有,请参阅波希米亚人的回复。这是最符合逻辑的解决方案。请注意,您的代码将导致空列表出现异常。通常,sum函数是以空列表作为基本情况定义的,而不是大小为1的列表。是否必须使用recur
锡安?如果没有,请参阅波希米亚人的回复。这是最符合逻辑的解决方案。请注意,您的代码将导致空列表出现异常。通常,sum函数是以空列表作为基本情况定义的,而不是大小为1的列表。我没有投票,但他说使用函数编程范式。我认为for循环并不重要您在代码总数中使用了一个可变变量。这不是要求的。是的,所有赋值语句和循环都是无效的。我没有投票,但他说使用函数编程范式。我认为for循环并不重要您在代码总数中使用了一个可变变量。这不是要求的。是的,所有赋值语句和循环都无效。空整数列表的和传统上称为0,而不是null。如果没有为完全指定的输入值返回空列表,空列表会导致足够多的问题。我可能会确信空列表会返回0。虽然我还没有确信,但我肯定不会为空列表返回0。返回null或抛出IAE可能更好。空和为0。如果你认为乘法是重复加法,那么3*x就是x+x+x。因此,将0 x相加应该对应于0*x。类似地,空乘积为1 x^0=1,空析取| | a布尔值列表为false,空连词&&a布尔值列表为true。像求和运算这样的通用运算应该符合求和的标准数学定义。我同意null不是一个空列表,而是一个定义不清的列表,并且没有一个定义良好的和。一个空整数列表的和传统上称为0,而不是null。如果没有为完全指定的输入值返回空列表,空列表会导致足够多的问题。我可能会确信空列表会返回0。虽然我还没有确信,但我肯定不会为空列表返回0。返回null或抛出IAE可能更好。空和为0。如果你认为乘法是重复加法,那么3*x就是x+x+x。因此,将0 x相加应该对应于0*x。类似地,空乘积为1 x^0=1,空析取| | a布尔值列表为false,空连词&&a布尔值列表为true。像求和运算这样的通用运算应该符合求和的标准数学定义。我同意null不是一个空列表,而是一个定义不清的列表,并且没有一个定义良好的和。