【发布时间】:2012-02-14 03:50:30
【问题描述】:
各位程序员大家好。
我遇到了一个非常愚蠢的问题。我应该递归地对列表中的所有整数求和。我知道有一种更简单的方法可以做到这一点,实际上我也做了这个方法(见下面的课程)。但是这个赋值的意思是我必须把列表分成两半,然后在两半上递归计算总和,最后我只返回 half1 + half2。
问题是高级方法不返回所有值的总和。谁能帮帮我?
方法 sum 是简单的方法。 Summer(丹麦语总结)是更高级的方法。
package opgave1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class BinærSøgning {
public static void main(String[] args) {
Random random = new Random();
int tal = 3;
List<Integer> liste = new ArrayList<Integer>();
for (int i = 0; i < 10; i++)
liste.add(random.nextInt(10));
Collections.sort(liste);
System.out.println(liste);
// System.out.println(binærSøgning(liste, 0, tal));
System.out.println(summer(liste, 0));
}
public static int binærSøgning(List<Integer> liste, int start, int find) {
if (liste.size() > 0) {
int midt = liste.size() / 2;
if (liste.get(midt) == find)
return start + midt;
else if (liste.size() > 1) {
if (find < liste.get(midt))
return binærSøgning(liste.subList(0, midt), start, find);
else
return binærSøgning(liste.subList(midt + 1, liste.size()), start + midt + 1, find);
}
}
return -1;
}
public static int sum (List<Integer> list, int i)
{
if (i == list.size())
return 0;
else
return list.get(i) + sum(list, i+1);
}
public static int summer(List<Integer> list, int start){
int right = 0;
int left = 0;
if(start == list.size()){
return 0;
} else {
int mid = list.size() / 2;
if(start < mid){
left += list.get(start) + summer(list.subList(0, mid), start+1);
} else if(mid < list.size()){
right += list.get(mid) + summer(list.subList(mid+1, list.size()), mid+1);
}
}
return right + left;
}
}
【问题讨论】:
-
您应该尝试使用调试器或简单的打印语句来缩小错误来源。
-
+1 用于方法名称中的有趣字符! (binærSøgning) 并了解丹麦语中的 binarySearch
-
当列表的大小是 2 的幂(等 64)时,您是否有问题,我认为当您除以 2 时会丢失一些元素