我在将Java中的整数从1 ^ 2递归添加到n ^ 2时遇到了一些麻烦。
我希望能够在recurvMath方法中以递归方式执行此操作,但我得到的只是一个无限循环。
import java.util.Scanner;
public class Lab9Math {
int count = 0;
static double squareSum = 0;
public static void main(String[] args){
int n = 0;
Scanner scan = new Scanner(System.in);
System.out.println("Please enter the value you want n to be: ");
n = scan.nextInt();
Lab9Math est = new Lab9Math();
squareSum = est.recurvMath(n);
System.out.println("Sum is: "+squareSum);
}
public int recurvMath(int n){
System.out.println("N:" +n);
if(n == 0){
return 0;
}//end if
if (n == 1){
return 1;
}//end if
if (n > 1){
return (recurvMath((int) ((int) n+Math.pow(n, 2))));
}//end if
return 0;
}//end method
}//end class
我不完全了解递归定义的本质,因为我知道我可以到达这里:
return (int) (Math.pow(n, 2));
但是我无法正确合并recurvMath方法的调用才能使其正常工作。
任何帮助,将不胜感激。谢谢!
最佳答案
通常,在尝试解决递归问题时,在对它们进行编程之前尝试先解决它们会有所帮助。
您要对所有从12到n2的整数求和。我们需要做的第一件事是以一种适合递归的方式表达这一点。好吧,另一种说明此金额的方式是:
从12到(n-1)2的所有整数的总和,再加上n2
第一步通常是最困难的,因为它是最“明显的”。例如,我们知道“ a + b + c”与“ a + b”加“ c”相同,但是我们必须进行种种信念飞跃,并以这种方式陈述以使其递归形成。
因此,现在我们要处理特殊的基本情况0:
当n为0时,总和为0。
因此,让recurvMath(n)
为12到n2之间所有整数的总和。然后,以上内容直接转换为:
recurvMath(n)= recurvMath(n-1)+ n2
recurvMath(0)= 0
这很容易实现:
public int recurvMath(int n){
System.out.println("N:" +n);
if(n == 0){
return 0;
} else {
return recurvMath(n-1) + (n * n);
}
}
请注意,我选择使用
n * n
而不是Math.pow()
。这是因为Math.pow()
在double
而不是int
上运行。顺便说一句,您可能还想保护自己,防止用户输入负数作为输入,这可能会使您陷入困境。您可以使用
if (n <= 0)
代替if (n == 0)
,或者检查是否输入负数并抛出例如IllegalArgumentException
,甚至适当地使用Math.abs()
并赋予它负数的功能。另外,为完整起见,我们来看一下原始代码中的问题。您的问题专线是:
recurvMath((int) ((int) n+Math.pow(n, 2)))
让我们在脑海中追溯。您的
int
强制转换之一是不必要的,但是忽略了这一点,当n == 3
时,这是recurvMath(3 + Math.pow(3, 2))
,即recurvMath(12)
。每次您的人数都会增加。您永远不会遇到1或0的基本情况,因此永远也不会终止。最终,您要么得到整数溢出而结果不正确,要么出现堆栈溢出。