递归求和法

时间:2014-03-29 00:23:55

标签: java recursion methods

我目前正在研究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;
    }
  }
 }

2 个答案:

答案 0 :(得分:0)

您的代码中有两个错误:

  1. fix b&gt; = array.length:如果我给出1到10的边界数组有11个元素。这导致索引为0到10.如果使用b = array.length调用array [b],则长度为11且超出范围。
  2. array.length - 1:如果你正在调用summation(数组,b + 1),则索引b不得超过max-index - 1.例如bounds:1到10.所以summation(array,10)调用summation(array,11),这就是数组中的最后一个元素。
  3. 所以求和(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;
        }
    

答案 1 :(得分:0)

在else部分:

   System.out.println("parameter 2: " + array[b + 1]);

需要有效的索引:

b + 1 < array.length
b < array.length - 1

但if-else仅仅保证:

b <= array.length
b < array.length + 1

因此它应该是

if (b >= array.length - 1) { ... } else { ... }

Amd然后如果您打算在逻辑中出错:

sum of lower + (lower + 1) + (lower + 2) + ... + upper

这些是(上 - 下+ 1)平均项(上/下)/ 2:

int sum = (upper - lower + 1) * (upper + lower) / 2;

其中一个因素即使它们相差2*lower+1,因此整数计算也可以:整数除法不会丢失任何东西。

实施例

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