我目前正在研究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;
}
}
}
答案 0 :(得分:0)
您的代码中有两个错误:
所以求和(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