Java递归求幂方法使递归更高效

标签 java recursion methods exponentiation coding-efficiency

我想更改此求幂方法(n 是指数):

public static double exponentiate(double x, int n) {
    counter++; 
    if (n == 0) {
        return 1.0;
    } else if (n == 1) {
        return x;
    } else {
        return x * exponentiate(x, n - 1);
    }
}

我想更改该方法以使其更加高效,因此该方法不会打开 n 次,而是最多 (n/2+1) 次而不使用 MATH 类。

到目前为止,我想出了这段代码:

public static double exponentiate(double x, int n) {
    counter++; 
    if (n == 0) {
        return 1.0;
    } else if (n == 1) {
        return x;
    } else {
        if (n % 2 == 0) {
            n = n-(n-1);
        } else {
            n = ((n-1) / 2) + n;
        }
        return ((x * x) * exponentiate(x, n - (n / 2)));
    }
}

但不知何故,它只适用于奇数 n,不适用于偶数 n。

有人可以帮忙吗?

谢谢!

最佳答案

我认为您可以通过计算exponentiate(x,n/2)一次并使用它来优化上述方法,使其运行时间为O(logn)

类似这样的:-

public static double exponentiate(double x, int n) 
{ 
    int temp; 
    if(n == 0) 
        return 1; 
    temp = exponentiate(x, n/2); 
    if (n%2 == 0) 
        return temp*temp; 
    else
        return x*temp*temp; 
} 

希望这有帮助!

关于Java递归求幂方法使递归更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59240062/

相关文章:

java - 为什么我不能在 arraylist 中使用 getFixed 方法?我怎样才能让它发挥作用?

java - 在项目源或资源 GWT 中找不到类

java - 数组中的值未分配 - java

java - 使用 Windows 锁定屏幕后删除 Kerberos 缓存票证

javascript - 为什么汉诺塔中的 'disc' 值在 'disc' 次调用中不会递减为 0?

sqlite - 是否可以在sqlite中使用START WITH CONNECT BY命令?

javascript - 在 JavaScript 中将方法作为参数传递

java - 如何在 Java 中为公共(public)方法超时?

Java-文件操作

powershell - 我可以根据其值获得子属性吗?