我如何创建一个递归方法来执行exp的n但在Java中返回一个字符串n次

时间:2017-07-23 03:28:45

标签: java recursion

所以我正在做练习,但是我在使用递归方法时遇到了不好的时间。

我希望方法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));
}

3 个答案:

答案 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));
}

输出:

********