Java 递归求和法
我目前正在用java开发一个递归求和方法,这是我迄今为止的代码,但是在运行时使用ArrayIndexOutOfBoundsException时遇到了一些问题。这是到目前为止完成的代码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() {
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]);
返回结果;
}
}
}
您的代码中有两个错误:
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