本实例不是为了说明这几种方法效率问题,只是为提供一个新的思路。
参考总结了4种思想。
a[]={...}
begin=0;end=a.length()-1;
1,从begin开始一直加到end
2,从end开始一直加到begin
3,begin和end同时开始进行加法操作
4,定义中点middle,对[begin,middle),[middle,end)进行操作,思想:二分法
public class a1test {
// 从n递减调用递归
public static void f(int n) {
if (n > 0)
f(n - 1);// 打印0-(n-1)
System.out.println(n);// 打印 n
}
// 打印begin-end
public static void f2(int begin, int end) {
if (begin > end)
return;
System.out.println(begin);// 打印begin
f2(begin + 1, end);// 打印begin+1 - end
}
// 求a数组中,从begin到结束的元素和
private static int f3(int[] a, int begin) {
if (begin == a.length)
return 0;
int x = f3(a, begin + 1);
return x + a[begin];
}
// 求a数组中,从end到第一个的元素和
private static int f4(int[] a, int end) {
if (end < 0)
return 0;
int x = f4(a, end - 1);
return x + a[end];
}
// 两边逼近求和
private static int f5(int[] a, int begin, int end) {
if (end - begin == 1)// 数组长度为偶数
{
return a[begin] + a[end];// 将上层传下来第begin号元素和第end号元素对应数值返回
}
if (end - begin == 0)// 数组长度为奇数
{
return a[end];
}
int x = f5(a, begin + 1, end - 1);
System.out.println(x);
return x + a[begin] + a[end];
}
// 折半求和 利用中间值
private static int f6(int[] a, int begin, int end) {
int middle = (begin + end) / 2;
if (begin > end)
return 0;
if (begin == end)
return a[end];
return f6(a, begin, middle) + f6(a, middle + 1, end);
}
public static void main(String[] args) {
// f(10);
// f2(0, 9);
int[] a = { 2, 5, 3, 9, 12, 7 };
// int sum=f3(a, 0);
// int sum=f4(a, a.length-1);
// int sum = f5(a, 0, a.length - 1);
int sum = f6(a, 0, a.length - 1);
System.out.println(sum);
}
}
此次仅为自我总结,防止忘记。