Java 如何递归地计算一个升为幂的数?

Java 如何递归地计算一个升为幂的数?,java,Java,我试过: static public void power(int n, int X) { System.out.print( + " "); if (n>0) { power(n-1, X); } } 这不会产生一个值,因为我不知道该如何做。试试这个-> public class HelloWorld{ public long powerfun(int n,int power,long val

我试过:

static public void power(int n, int X) {

        System.out.print( + " ");

        if (n>0) {
            power(n-1, X);
        }
    }
这不会产生一个值,因为我不知道该如何做。

试试这个->

public class HelloWorld{

    public long powerfun(int n,int power,long value){
        if(power<1){
            return value;
        }
        else{
            value = value * n;
            return powerfun(n,power-1,value);
        }
    }

     public static void main(String []args){
         HelloWorld hello = new HelloWorld();
        System.out.println(hello.powerfun(5,4,1));
     }
}
试试这个->

public class HelloWorld{

    public long powerfun(int n,int power,long value){
        if(power<1){
            return value;
        }
        else{
            value = value * n;
            return powerfun(n,power-1,value);
        }
    }

     public static void main(String []args){
         HelloWorld hello = new HelloWorld();
        System.out.println(hello.powerfun(5,4,1));
     }
}
试试这个

public int calculatePower(int base, int powerRaised)
{
    if (powerRaised != 0)
        return (base*calculatePower(base, powerRaised-1));
    else
        return 1;
}
试试这个

public int calculatePower(int base, int powerRaised)
{
    if (powerRaised != 0)
        return (base*calculatePower(base, powerRaised-1));
    else
        return 1;
}

希望这能满足您的解决方案。我试着添加注释,向您解释逻辑

//Creating a new class
public class RecursivePower {

    // Create the function that will calculate the power
    // n is the number to be raised to a power
    // x is the number by which we are raising n
    // i.e. n^x
    public static int power(int n, int x){
        // Anything raised to the 0th power is 1
        // So, check for that
        if (x != 0){
            // Recursively call the power function
            return (n * power(n, x-1));

        // If that is true...    
        }else{
            return 1;
        } //end if else
    } //end power

    // Example driver function to show your program is working
    public static void main(String[] args){
        System.out.println("The number 5 raised to 6 is " + power(5,6));
        System.out.println("The number 10 raised to 3 is " + power(10,3));
    } //end psvm

} //end RecursivePower

希望这能满足您的解决方案。我试着添加注释,向您解释逻辑

//Creating a new class
public class RecursivePower {

    // Create the function that will calculate the power
    // n is the number to be raised to a power
    // x is the number by which we are raising n
    // i.e. n^x
    public static int power(int n, int x){
        // Anything raised to the 0th power is 1
        // So, check for that
        if (x != 0){
            // Recursively call the power function
            return (n * power(n, x-1));

        // If that is true...    
        }else{
            return 1;
        } //end if else
    } //end power

    // Example driver function to show your program is working
    public static void main(String[] args){
        System.out.println("The number 5 raised to 6 is " + power(5,6));
        System.out.println("The number 10 raised to 3 is " + power(10,3));
    } //end psvm

} //end RecursivePower

将X视为数字,n视为幂,如果两者都是正整数

    public static int power(int n, int X) {

            if (n == 0) {
                return 1;
            } else if(n == 1) {
                return X;
            } else {
                return X * power(n-1, X);
            }
    }

将X视为数字,n视为幂,如果两者都是正整数

    public static int power(int n, int X) {

            if (n == 0) {
                return 1;
            } else if(n == 1) {
                return X;
            } else {
                return X * power(n-1, X);
            }
    }

让我们重新编写函数:

static public void power(int n, int X) {

    System.out.print( + " ");

    if (n>0) {
        power(n-1, X);
    }
}
首先,让我们将void更改为int

之后,当n等于1时,我们将结果返回为X,因为X^1=X:


让我们重新编写函数:

static public void power(int n, int X) {

    System.out.print( + " ");

    if (n>0) {
        power(n-1, X);
    }
}
首先,让我们将void更改为int

之后,当n等于1时,我们将结果返回为X,因为X^1=X:

其他人有书面的解决方案,可以给你正确的答案,但是他们的时间复杂度是开着的,因为你只减少了1的功率。下面的解决方案将花费更少的时间。这里的诀窍是

x^y = x^(y/2) * x^(y/2)
所以我们只需要计算x^y/2,然后求平方。如果y是偶数,那么就没有问题了,但当y是奇数时,我们必须将它乘以x。比如说

3^5=3^5/2*3^5/2 但是5/2=2,所以上面的方程会变成3^2*3^2,所以我们必须再乘以3,然后它会变成3*3^5/2*3^5/2 那么3^2将被计算为3^2/1*3^2/1,这里不需要乘以3。 我希望这是清楚的

        Scanner s = new Scanner(System.in) ;
        System.out.println("Enter n");
        int n = s.nextInt();
        System.out.println("Enter x");
        int x =s.nextInt();
        if (n>0){
            double pow =Math.pow(n,x);
            System.out.println(pow);
        }
其他人有书面的解决方案,可以给你正确的答案,但是他们的时间复杂度是开着的,因为你只减少了1的功率。下面的解决方案将花费更少的时间。这里的诀窍是

x^y = x^(y/2) * x^(y/2)
所以我们只需要计算x^y/2,然后求平方。如果y是偶数,那么就没有问题了,但当y是奇数时,我们必须将它乘以x。比如说

3^5=3^5/2*3^5/2 但是5/2=2,所以上面的方程会变成3^2*3^2,所以我们必须再乘以3,然后它会变成3*3^5/2*3^5/2 那么3^2将被计算为3^2/1*3^2/1,这里不需要乘以3。
我希望这一点很清楚

虽然其他人在代码方面为您提供了解决方案,但我想重点介绍一下您的代码不起作用的原因

        Scanner s = new Scanner(System.in) ;
        System.out.println("Enter n");
        int n = s.nextInt();
        System.out.println("Enter x");
        int x =s.nextInt();
        if (n>0){
            double pow =Math.pow(n,x);
            System.out.println(pow);
        }
递归是一种编程技术,其中方法函数调用自身。所有递归都具有两个特定特征:

当它调用自己时,它这样做是为了解决一个较小的问题。在您的示例中,为了将X提高到N的幂,该方法使用参数X和N-1递归地调用自己,也就是说,每进一步一步都解决一个较小的问题。 最终有一个版本的问题是微不足道的,这样递归就可以解决它,而无需调用自身并返回。这称为基本情况。 如果你熟悉数学归纳法,递归就是它的编程等价物

上面第二点是您的代码所缺少的。您的方法从不返回任何数字。在将一个数字提升到一个幂的情况下,基本情况是解决数字0的问题,因为将零提升到任何幂都会产生一个,因此代码不需要再次调用自身来解决这个问题

因此,正如其他人已经建议的,您需要对代码进行两个更正:

为方法添加一个返回类型。 明确说明基本情况。
虽然其他人在代码方面为您提供了解决方案,但我想重点介绍一下为什么您的代码不起作用

递归是一种编程技术,其中方法函数调用自身。所有递归都具有两个特定特征:

当它调用自己时,它这样做是为了解决一个较小的问题。在您的示例中,为了将X提高到N的幂,该方法使用参数X和N-1递归地调用自己,也就是说,每进一步一步都解决一个较小的问题。 最终有一个版本的问题是微不足道的,这样递归就可以解决它,而无需调用自身并返回。这称为基本情况。 如果你熟悉数学归纳法,递归就是它的编程等价物

上面第二点是您的代码所缺少的。您的方法从不返回任何数字。在将一个数字提升到一个幂的情况下,基本情况是解决数字0的问题,因为将零提升到任何幂都会产生一个,因此代码不需要再次调用自身来解决这个问题

因此,正如其他人已经建议的,您需要对代码进行两个更正:

为方法添加一个返回类型。 明确说明基本情况。
记住,这对负能量不起作用,你需要使用这段代码->记住,这对负能量不起作用,你需要使用这段代码->我认为OP不打算使用内置的pow功能。其次,您的代码在语法上是错误的。它不会编译。第三,即使你纠正了语法。它给出了错误的o/p。请更正它。在i/p n=5和x时,它给出了什么o/p=
3.你的代码是64。我已经编辑了你的代码,现在它是正确的。请看,哦!问题是n-1谢谢,我是说你的原始代码是。第6行缺少大括号。是的,n-1给出了错误的答案。很好,我想OP不是有意使用内置pow功能的。其次,您的代码在语法上是错误的。它不会编译。第三,即使你纠正了语法。它给出了错误的o/p。请更正。在i/p n=5和x=3时,它给出了什么o/p?你的代码是64。我已经编辑了你的代码,现在它是正确的。请看,哦!问题是n-1谢谢,我是说你的原始代码是。第6行缺少大括号。是的,n-1给出了错误的答案。不客气