我在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方法以使其工作。 任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
一般来说,在尝试解决递归问题时,在编程之前尝试将它们弄清楚是有帮助的。
您希望将1 2 中的所有整数与n 2 相加。我们需要做的第一件事就是以适合递归的方式表达这一点。好吧,说明这笔钱的另一种方式是:
第一步通常是最难的,因为它是最“明显”的。例如,我们知道“a + b + c”与“a + b”相同,再加上“c”,但是我们必须对各种各样的信念进行一次飞跃,并将其说明为将其转化为递归形式。
所以,现在我们必须处理特殊的基础案例,0:
所以让我们让recurvMath(n)
为从1 2 到n 2 的所有整数的总和。然后,以上直接转换为:
这很容易实现:
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的基本情况,所以你永远不会终止。最终你得到一个整数溢出,结果不正确,或者堆栈溢出。
答案 1 :(得分:0)
试试这个
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 == 1){
return 1;
}//end if
// More simplified solution
return recurvMath(n-1) + (int) Math.pow(n, 2); // Here is made changes
}//end method
}//end class
答案 2 :(得分:0)
而不是说:
return (recurvMath((int) ((int) n+Math.pow(n, 2))));
我反而说:
return (int) ((Math.pow(n, 2)+recurvMath(n-1)));