Java 递归求和法

Java 递归求和法,java,recursion,methods,Java,Recursion,Methods,我目前正在用java开发一个递归求和方法,这是我迄今为止的代码,但是在运行时使用ArrayIndexOutOfBoundsException时遇到了一些问题。这是到目前为止完成的代码 import java.util.Scanner; public class Summation { public static void main(String[] args) { input(); } private static void input() {

我目前正在用java开发一个递归求和方法,这是我迄今为止的代码,但是在运行时使用ArrayIndexOutOfBoundsException时遇到了一些问题。这是到目前为止完成的代码

   import java.util.Scanner;
   public class Summation {
   public static void main(String[] args) {
    input();
   }

    private static void input() {
       Scanner scanner = new Scanner(System.in);
        System.out.print("Lower bound: ");
        int lower = scanner.nextInt();
        System.out.print("Upper bound: ");
        int upper = scanner.nextInt();
        arrayForm(upper, lower);
   }

   private static void arrayForm(int upper, int lower) {
        int b = 0;
        int a = Math.abs(lower) + Math.abs(upper);
        int array[] = new int[a];
        for (int i = 0; i < array.length; i++) {
           array[i] = lower + i;
        }
       summation(array, b);
   }

   public static int summation(int array[], int b) {
       if (b > array.length) {
        System.out.println("Cannot continue");
        return 0;
    } else{
        int result = array[b] + summation(array, b + 1);
        System.out.println("recursion call: " + b);
        System.out.println("sum: " + result);
        System.out.println("parameter 1: " + array[b]);
        System.out.println("parameter 2: " + array[b + 1]);
        return result;
    }
  }
 }
import java.util.Scanner;
公开课总结{
公共静态void main(字符串[]args){
输入();
}
私有静态void输入(){
扫描仪=新的扫描仪(System.in);
系统输出打印(“下限:”);
int lower=scanner.nextInt();
系统输出打印(“上限:”);
int upper=scanner.nextInt();
阵列形式(上、下);
}
专用静态void数组形式(整数上限,整数下限){
int b=0;
inta=Math.abs(下)+Math.abs(上);
int数组[]=新的int[a];
for(int i=0;iarray.length){
System.out.println(“无法继续”);
返回0;
}否则{
int结果=数组[b]+求和(数组,b+1);
System.out.println(“递归调用:”+b);
System.out.println(“总和:+结果”);
System.out.println(“参数1:+array[b]);
System.out.println(“参数2:+array[b+1]);
返回结果;
}
}
}

您的代码中有两个错误:

  • fix b>=array.length:如果我给边界1到10,那么数组有11个元素。这将导致索引为0到10。如果用b=array.length调用数组[b],则长度为11,这超出了范围
  • array.length-1:因为您调用的是求和(array,b+1),所以索引b不能超过最大索引-1。例如边界:1到10。所以求和(array,10)调用求和(array,11),这是数组中的最后一个元素
  • 求和(a,b)函数如下所示:

        public static int summation(int array[], int b) {
        if (b >= array.length - 1) {
            System.out.println("Cannot continue");
            return 0;
        } else {
            int result = array[b] + summation(array, b + 1);
            System.out.println("recursion call: " + b);
            System.out.println("sum: " + result);
            System.out.println("parameter 1: " + array[b]);
            System.out.println("parameter 2: " + array[b + 1]);
            System.out.println();
            return result;
        }
    
    在其他部分:

       System.out.println("parameter 2: " + array[b + 1]);
    
    需要一个有效的索引:

    b + 1 < array.length
    b < array.length - 1
    
    Amd如果您打算:

    sum of lower + (lower + 1) + (lower + 2) + ... + upper
    
    这些是(上-下+1)平均值项(上+下)/2:

    这两个因子中的任何一个都是相等的,因为它们相差
    2*lower+1
    ,所以整数计算是可以的:整数除以不会损失任何东西

    范例

    sum(7, 9) = (9 - 7 + 1) * (9 + 7) = 3 * 16 = 48
    

    数组从
    0
    length-1
    ,您在
    >length
    处停止,您应该在
    ==length
    处停止-这是一个错误。因为您调用的是
    求和(数组,b+1)
    ,它实际上需要是
    (b>array.length-2)
    (b>=array.length-1)
    你是说这行“if(b>array.length)”应该是“if(b==array.length)”吗?因为我还是会犯同样的错误?>添加
    System.out.println(“array.length=“+array.length+”,b=“+b”)作为求和的第一行,看看它告诉你什么。你真正想做什么?从下限到上限求和?下限:2上限:4不能继续递归调用:4求和:6参数1:6参数2:7递归调用:3求和:11参数1:5参数2:6递归调用:2求和:15参数1:4参数2:5递归调用:1求和:18参数1:3参数2:4递归调用:0求和:20参数1:2参数2:3过程完成。这是我得到的输出。谢谢你的帮助,我相信这是正确的!我现在已经开始运行代码了,谢谢你的帮助!
    
    sum of lower + (lower + 1) + (lower + 2) + ... + upper
    
    int sum = (upper - lower + 1) * (upper + lower) / 2;
    
    sum(7, 9) = (9 - 7 + 1) * (9 + 7) = 3 * 16 = 48