使用重复平方计算功率的递归方法

时间:2016-01-22 10:50:47

标签: 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)) * p(x, (n - 1 / 2));

    }

    public static void main(String[] args) {

        System.out.println(Main.p(2, 3));

    }

}

然而,在运行它时,我得到一个StackOverflowError - 我看了这个,似乎递归“太深”,堆栈无法处理它。但我很困惑,因为当n = 0时,递归应该停止,因为这是一个基本情况。我该如何纠正这个问题?

1 个答案:

答案 0 :(得分: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的任何数字。

另外,你最好不要静态地调用这个方法(技术上很简单' slopppy programming')。

最好将类实例化为对象并以此方式调用方法。