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,准确地说。