我需要在1.)for循环方法和2.)递归方法中计算连续整数的总和。这两种方法都是带有两个int参数的静态int方法(一个是起始int,另一个是在其后的int数)。例如,如果我要输入(3,3),则输出应为18,因为3是起始数字,后面的3个整数是4、5和6。将所有这些加起来(3 + 4 + 5) +6),您得到18。这两个方法都在执行相同的数学运算,不同的是一个方法使用for循环进行此操作,而另一个方法以递归方式进行。
我在这里遇到的问题是我的for循环方法未正确总结。当我输入(3,3)时,输出为31。此外,由于我的for循环方法不起作用,我不确定如何编写递归方法。我可以在这方面得到一些帮助吗?
也没有数组或ArrayList。此代码应该可以在不使用这些代码的情况下工作。
public static int consecSum(int startingNum, int numInts){
for (int i = numInts; i>0; i--){
startingNum += (startingNum + 1);
}
return startingNum;
}
public static int recursSum(int startingNum, int numInts) {
if (startingNum == 0) {
return 0;
} else if (numInts == 0) {
return startingNum;
}
return startingNum + recursSum(startingNum + numInts, numInts - 1);
}
3 \\startingNum (theres more code not shown where I use a scanner object to input these)
3 \\numInts
31 \\for loop output
\\The recursive method just prints an error message
答案 0 :(得分:0)
迭代解决方案的问题在于,您要在每次迭代中修改起点。相反,可以对总和使用单独的变量:
public static int consecSum(int startingNum, int numInts){
int sum = 0;
for (int i = numInts; i>0; i--){
sum += (startingNum + 1);
}
return sum;
}
递归实现有一个类似的问题:
public static int recursSum(int startingNum, int numInts) {
if (numInts == 0) {
return startingNum;
}
return startingNum + recursSum(startingNum + 1, numInts - 1);
}
答案 1 :(得分:0)
迭代方法:
public static int consecSum(int startingNum, int numInts){
int sum = startingNum++;
for (int i = numInts; i>0; i--, startingNum++;){
sum += startingNum;
}
return sum;
}
递归方法:
public static int recursSum(int startingNum, int numInts) {
if (numInts < 0) {
return startingNum;
}
return startingNum + recursSum(startingNum+1, numInts - 1);
}
答案 2 :(得分:0)
在您的consecSum()
中,您将使用startingNum
更新循环中的startingNum += (startingNum + 1)
。
您应该为结果使用一个新变量:
public static int consecSum(int startingNum, int numInts) {
int result = startingNum;
for (int i = numInts; i > 0; i--) {
result += (startingNum + i);
}
return result;
}
在您的recursSum
中,您将在每次迭代中添加startingNum + numInts
。只需添加1
:
public static int recursSum(int startingNum, int numInts) {
if (numInts <= 0) {
return startingNum;
}
return startingNum + recursSum(startingNum + 1, numInts - 1);
}
在两种情况下,(3, 3)
的结果都是18
。
答案 3 :(得分:0)
for循环解决方案中的问题是您认为“最后一个整数”实际上是“最后一个总和”。你想说
startingNum = 3
startingNum = 3 + 4
startingNum = 7 + 5
startingNum = 12 + 6
但是由于您始终将新的总和保留在startingNum
本身之内,所以发生了这种情况
startingNum = 3
startingNum = 3 + 4
startingNum = 7 + 8 (because startingNum + 1 = 7 + 1 = 8)
startingNum = 15 + 16
试试看
public static int consecSum(int startingNum, int numInts){
int nextNum = startingNum + 1;
for (int i = numInts; i>0; i--){
startingNum += nextNum;
nextNum++;
}
return startingNum;
}
您几乎拥有它。根据我所看到的,您的思维过程是,如果整数的数量为0,则必须返回起始数字,否则应返回起始数字+在下一个数字上调用的方法的输出。那绝对是正确的。尝试这些修改
public static int recursSum(int startingNum, int numInts) {
if (numInts == 0) {
// eventually the numInts will become 0, meaning there's no
// numbers to add after this startingNum, so just return it
return startingNum;
}
// otherwise, if numInts > 0, that means there are other numbers to add so
// return the sum of the current number with the output of the function called
// on the next number (while not forgetting to decrease the number of integers
// we should consider after that)
return startingNum + recursSum(startingNum + 1 /* next number */, numInts - 1 /* decrease the number of integers to consider after that */);
}