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