2015-04-17 24 views
1

我试图回答这个问题,但我似乎无法让它恢复正确。我知道这将是非常简单的,但我似乎无法得到这个。这是用java编写的。java的递归明星力量

编写一个递归方法starString,它接受一个整数参数n 并返回包含星号(星号)的长度为2n的字符串对象(即2到n次幂)。 例如:请忽略这是用于格式化的破折号。我只需要发回什么是""

调用---------------------输出----------- ---------原因

starString(0); ------ * -------------------- 2power0 = 1

starString(1); - ---- ** -------------------- 2power1= 2

starString(2); ------ **** ------------ -------- 2power2= 4

你可能会认为n>0。请注意,您的方法体不能使用迭代

这里是我有:

private static String star(int n){ 
    if (n==0){ 
     String b ="*"; 
     return b; 
    } 
    else { 
     String b ="**"; 
     n-=1; 
     star(n); 
     return b; 
    } 
} 
+0

首先阅读了关于递归。如果我们在这里提供答案。它不会帮助你理解 –

+0

可能的提示:''*“'+'”*“'=>'”**“'''**”'''''* ***“'/ etc – 2015-04-17 11:27:24

+0

我同意@ThusithaThilinaDayaratne。几个月前,我自己一直在与递归做斗争,并想了解这个概念以及如何使用它。 [本网站](http://codingbat.com/java/Recursion-1)帮助我很好地理解递归。我还没有完成所有测试,但我发现它确实很好。 –

回答

2

对于任何n > 0你总是返回"**",而忽略star(n)电话,这是错误的结果。
正确的版本是:

private static String star(int n) { 
    if (n==0) { 
    String b ="*"; 
    return b; 
    } else { 
    String t = star(n-1); 
    return t + t; 
    } 
} 
+5

不要回答这个问题。然后他不会试图去理解这个概念。 –

+0

这个答案是不正确的。星星的长度正好是'n + 1'的长度。 –

+1

@BuhakeSindi你为什么这么认为? 'star(0) - > *''''star(1) - > **','star(2) - > ****'等。这就是要求的,不是吗? –

3

试试这个:

private static String startStar(int n) { 
    if (n==0) { 
     return "*"; 
    } else { 
     return startStar(n-1)+startStar(n-1); 
    } 
} 
+0

一次调用递归并将结果加倍会更有效。您的解决方案进行2 ** n-1递归调用。 – pjs

+0

@pjs,n = 0时的情况如何?当你将结果加倍时,你将得到2而不是1. – baza92

+0

首先,OP明确表示n> 0.其次,如果用0调用,那么你不会在else子句中发生加倍。 – pjs

0
private static String starString(int n) throws IllegalArgumentException { 
    if (n == 0) { 
     return "*"; 
    } else if (n < 0) { 
     try { 
      throw new IllegalArgumentException("You can't pass a value less than 0"); 
     } catch (IllegalArgumentException e) { 
      System.out.println("Caught an IllegalArgumentException: " + e.getMessage()); 
      return ""; 
     } 
    } else { 
     return starString(n - 1) + starString(n - 1); 
    } 
}