Java 用重复平方法计算幂的递推方法
我编写了这个递归方法:Java 用重复平方法计算幂的递推方法,java,recursion,Java,Recursion,我编写了这个递归方法: public class Main { public static int p(int x, int n) { if (n == 0) return 0; else if (n % 2 == 0) return p(x, (n / 2)) * p(x, (n / 2)); else return x * p(x, (n - 1 / 2)) *
public class Main {
public static int p(int x, int n) {
if (n == 0)
return 0;
else if (n % 2 == 0)
return p(x, (n / 2)) * p(x, (n / 2));
else
return x * p(x, (n - 1 / 2)) * p(x, (n - 1 / 2));
}
public static void main(String[] args) {
System.out.println(Main.p(2, 3));
}
}
然而,在运行它时,我得到了一个StackOverflower错误——我查了一下,似乎递归“太深”,堆栈无法处理它。但是我很困惑,因为当n=0时,递归应该停止,因为这是一个基本情况。如何更正此问题?您需要使用正确的括号,即确保括号符合您的要求
public class Main
{
public static int p(int x, int n)
{
if (n == 0)
return 1;
else if (n % 2 == 0)
return p(x, (n / 2)) * p(x, (n / 2));
else
return x * p(x, ((n - 1) / 2)) * p(x, ((n - 1) / 2));
}
public static void main(String[] args)
{
System.out.println(Main.p(2, 3));
}
注意:注意括号中的(n-1)。还要注意,当n==0时,我们返回1,因为0的幂为1的任何数字
此外,最好不要静态调用该方法(从技术上讲,这是“草率编程”)
最好将类实例化为对象并以这种方式调用方法 您需要使用正确的括号,即确保括号符合您的要求
public class Main
{
public static int p(int x, int n)
{
if (n == 0)
return 1;
else if (n % 2 == 0)
return p(x, (n / 2)) * p(x, (n / 2));
else
return x * p(x, ((n - 1) / 2)) * p(x, ((n - 1) / 2));
}
public static void main(String[] args)
{
System.out.println(Main.p(2, 3));
}
注意:注意括号中的(n-1)。还要注意,当n==0时,我们返回1,因为0的幂为1的任何数字
此外,最好不要静态调用该方法(从技术上讲,这是“草率编程”)
最好将类实例化为对象并以这种方式调用方法
n-1/2
并不像你想象的那样<代码>(n-1)/2does;)。啊,是的,我的错。谢谢我还发现了我犯的另一个错误,if(n==0)应该是if(n==1)对不起,我的意思是它应该返回1。Java不会推断p(x,(n/2))==p(x,(n/2))
,只计算一次。我建议你把这些结果放进一个变量中。n-1/2
并不像你想象的那样<代码>(n-1)/2does;)。啊,是的,我的错。谢谢我还发现了我犯的另一个错误,if(n==0)应该是if(n==1)对不起,我的意思是它应该返回1。Java不会推断p(x,(n/2))==p(x,(n/2))
,只计算一次。我建议你把这些结果放到一个变量里。是的,我同意。但我只是在玩弄它,因此我在这里使用了static(编写更少的代码来测试它),我还发现了我犯的另一个错误,如果(n==0)应该是如果(n==1)很高兴看到您尝试解决自己的问题,我设法忽略了这一点。但是,(n==0)是正确的,但是这应该返回1而不是0(您已经有了),因为0的幂的任何数字都是1。我会更新我的答案。对不起,我想说它应该返回1,没错。是的,我同意。但我只是在玩弄它,因此我在这里使用了static(编写更少的代码来测试它),我还发现了我犯的另一个错误,如果(n==0)应该是如果(n==1)很高兴看到您尝试解决自己的问题,我设法忽略了这一点。但是,(n==0)是正确的,但是这应该返回1而不是0(您已经有了),因为0的幂的任何数字都是1。我会更新我的答案。对不起,我的意思是它应该返回1,准确地说。