所以我正在做练习,但是我在使用递归方法时遇到了不好的时间。
我希望方法starPower
在星号(“*”)中将2的幂返回到n,但是我得到了堆栈溢出。
有人能告诉我我做错了什么吗?
这是我到目前为止所拥有的:
public static String starPower(int n){
String str = "*";
if (n<0)
throw new IllegalArgumentException("n has an invalid value");
if (n==0)
{return str;
}
return str + starPower( Math.pow(2,n-1));
}
答案 0 :(得分:2)
请勿使用Math.pow()
。您的方法应该是递归的并且使用简单的操作。
我不会给你代码,但解释它应该如何工作。首先,这是预期的结果:
starPower(0) = "*" // 2^0 = 1 stars
starPower(1) = "**" // 2^1 = 2 stars
starPower(2) = "****" // 2^2 = 4 stars
starPower(3) = "********" // 2^3 = 8 stars
starPower(4) = "****************" // 2^4 = 16 stars
starPower(5) = "********************************" // 2^5 = 32 stars
starPower(6) = "****************************************************************"
. . .
如您所见,starPower(n)
的结果是{sup> 1 的结果starPower(n - 1)
。这是你的简单递归。
1)加倍,我的意思是加倍长度,即与自身连接的字符串。
答案 1 :(得分:0)
你必须递归思考,这是非常困难的。如果你连接n-1
的两个函数调用的结果,那么你将有两个整体。但请注意,由于使用相同的输入调用该函数两次将产生两次相同的输出。所以你可以通过只调用一次并使用结果两次来帮助减轻堆栈的负担。
尝试以这样的方式将其可视化为调用starPower(3)
的示例。它调用starPower(2)
并将其结果与自身连接起来。调用starPower(2)
调用starPower(1)
并将其结果与自身连接起来。 starPower(1)
调用starPower(0)
并将其结果与自身连接起来。
starPower(0)
始终返回"*"
;这是基本情况。你现在可以从这里建立起来。 starPower(1)
将其中两个粘贴在一起制作"**"
。 starPower(2)
将其中两个联合起来"****"
。现在有希望出现一种模式。最后,starPower(3)
取两个并将它们连接起来,以得到"********"
的最终结果,即8或2³星号。
3: ********
2: **** ****
1: ** ** ** **
0: * * * * * * * *
以下是实施该解决方案的修改后的代码。
public static String starPower(int n) {
if (n < 0) {
throw new IllegalArgumentException("n has an invalid value");
}
if (n == 0) {
return "*";
}
String halfResult = starPower(n - 1);
return halfResult + halfResult;
}
答案 2 :(得分:0)
您需要了解问题中输出的模式才能解决问题。
如果你能在n
的每种情况下找到输入和输出之间的关系,你可以解决它。这种思维方式叫做逆向工程。
正如Andreas在测试用例的回答中所说,您可以得出结论starPower(n)
是starPower(n - 1)
的结果的两倍:
starPower(0) = "*"
starPower(1) = "**"
starPower(2) = "****"
因此您只需要在每次递归调用中将"*"
的结果加倍:
public static String starPower(int n){
if (n < 0){
throw new IllegalArgumentException("n has an invalid value");
}
if (n==0){
return "*";
}
return starPower(n-1) + starPower(n-1);
}
public static void main(String[] args) {
System.out.println(starPower(3));
}
输出:
********