如何使用递归计算幂的幂? [关闭]

Posted

技术标签:

【中文标题】如何使用递归计算幂的幂? [关闭]【英文标题】:How to compute a power of a power using recursion? [closed] 【发布时间】:2017-03-28 22:08:37 【问题描述】:

我最近一直在研究递归,这很令人困惑。我正在尝试编写一个 java 程序,它使用递归来生成一个基数到一个幂的结果,它也有一个基数有多少指数的高度。例如,底数为 2 的幂为 3,高度为 3:

(((2^3)^3)^3)

这是我的(非常有缺陷的)代码:

    public static void main(String[] args) 
    System.out.println(exponentWithHeight(2, 2, 3));


public static int exponentWithHeight(int base, int power, int height) 
    if (power < 0 || height < 0) 
        throw new IllegalArgumentException("Check input values.");
    
    if (power == 0) 
        return 1;
     else 
        return (base * height * exponentWithHeight(base, power - 1, height - 1));
    

我真的不确定如何获得我想要的输出;正如我所说,这对我来说真的很令人困惑和新奇。有人可以帮忙解释一下如何去做吗?

【问题讨论】:

你的预期输出是什么,你会得到什么?调试时发现了什么? 所以我在调用 exponentWithHeight(2, 2, 3) 方法时的预期输出是 256。相反,我得到了 24。当我调试它时,一切运行良好。 “一切运行完美”你是什么意思?调试时得到256?或者你没有得到任何错误? (后者是没有意义的,如果你没有得到正确的结果,你显然有错误) 请记住,您可以通过将一系列指数相乘来简化它们。所以(((2^3)^3)^3) = 2 ^ (3 * 3 * 3) = 2 ^ (3 ^ 3) - 有效地制作你的公式f(n, exp, height) = n ^ (exp ^ height)。可能能够利用它来简化您提出的任何解决方案。 这很有帮助,谢谢!没想到是这样的。 【参考方案1】:

这是一个双重递归,无论是高度还是功率。

请注意,如果将值缓存在某处有意义,因为 exponentWithHeight(base, power, 0) 将被重新计算多次。

这段代码的结果是256:

public static void main(String[] args) 
    System.out.println(exponentWithHeight(2, 2, 3));


public static int exponentWithHeight(int base, int power, int height) 
    if (power < 0 || height < 0) 
        throw new IllegalArgumentException("Invalid Input; Check power and/or height value.");
    
    if (base == 0) 
        return 0;
    
    if (height == 0) 
        return calcPower(base, power);
     else 
        return exponentWithHeight(calcPower(base, power), power, height - 1);
    


public static int calcPower(int base, int power) 
    if (power == 0) 
        return 1;
    
    return base * power(base, power - 1);

【讨论】:

这段代码似乎没有正确计算值;当我输入 (3,2,2) 时,我得到 729 而不是得到 81 作为答案。当你将 [exponentWithHeight(base, power, 0) * exponentWithHeight(base, power, height - 1) 相乘时到底发生了什么]? 对其进行了编辑。获得第一垒的价值和力量。并从幂中减去一。【参考方案2】:

我们是否忘记了可以将一系列指数相乘来简化方程?

以下应该可以工作。

public static int exponentWithHeight(int base, int power, int height) 
    if (power < 0 || height < 0) 
        throw new IllegalArgumentException("Invalid Input; Check power and/or height value.");
    
    if (power == 0 || height == 0) 
        return 1;
     else 
        return (int) Math.pow(base, Math.pow(power, height));
    

【讨论】:

除了Math.pow 返回double,而不是int,我认为OP 练习的重点不是使用Math.pow @AndyTurner OP 从未指定他们想要使用递归。 标题指定OP 确实想要(/需要)使用递归:“如何使用递归计算幂的幂?” @AndyTurner 如果是 X-Y 问题怎么办? 实际上说,OP 的解决方案方法很差。【参考方案3】:

这是另一个简单明了的示例,使用 for 循环计算幂,然后使用递归计算高度

public static long exponentWithHeight(long base, long power, long height) 
            long calculatedPower;
            if (power < 0 || height < 0) 
                throw new IllegalArgumentException("Invalid Input; Check power and/or height value.");
            
            if (power == 0) 
                return 1;
            
            if (height > 0) 
                calculatedPower = base;
                for (int i = (int) power; i > 1; i--) 
                        calculatedPower *= base;
                
                return exponentWithHeight(calculatedPower, power, --height);
            

            return base;

    

【讨论】:

谢谢!这很容易阅读,就像一个魅力。 不客气。但是您应该记住此代码仅适用于较小的幂和高度数字,因为如果您使用一些较大的数字作为幂或高度,例如 4 或以上,计算出的数字将超过 @987654322 的容量@数据类型最大值,它将返回0。

以上是关于如何使用递归计算幂的幂? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

计算给定递归函数的精确运行时间(时间复杂度)

使用递归计算大数的幂

使用矩阵求幂的线性递归[关闭]

递归思想(钻出牛角尖)

学习记录:快速幂

学习记录:快速幂