Java 使用递归将字符串打印n次
我在下列练习中遇到困难 编写一个方法starString,该方法接受整数参数n,并返回一个长度为2n的星号字符串,即n次方的2。例如:Java 使用递归将字符串打印n次,java,recursion,Java,Recursion,我在下列练习中遇到困难 编写一个方法starString,该方法接受整数参数n,并返回一个长度为2n的星号字符串,即n次方的2。例如: Call Output Reason starString(0); "*" 2^0 = 1 starString(1); "**" 2^1 = 2 starString(2); "****" 2^2 = 4 starString(3);
Call Output Reason
starString(0); "*" 2^0 = 1
starString(1); "**" 2^1 = 2
starString(2); "****" 2^2 = 4
starString(3); "********" 2^3 = 8
starString(4); "****************" 2^4 = 16
如果传递的值小于0,则应抛出IllegalArgumentException
我已经试过了,但我正在寻找一种方法,将字符串*乘以几次。警察局:我不能用。重复
我一直在计算n次方的2的值。正如我所尝试的
int x = (int)Math.pow(2,(n));
但我不知道该怎么办
public static String starString(int n) {
if(n<0){
throw new IllegalArgumentException("No negative values allowed");
}
if(n==0){
return "*";
}else{
return starString(0) + starString(n-1);
}
}
这将起作用,尽管它将爆炸为大n
public static String starString(int n) {
if(n<0){
throw new IllegalArgumentException("No negative values allowed");
}
if(n==0){
return "*";
}else{
return starString(n-1) + starString(n-1);
}
}
显然,你可以使用
public static int twoToN(int n) {
if(n<0){
throw new IllegalArgumentException("No negative values allowed");
}
if(n==0){
return 1;
}else{
return 2* twoToN(n-1);
}
}
你可以这样做
public static void main(String[] args) {
int count = (int)Math.pow(2, 4);
System.out.println(count);
String value = starString(count);
System.out.println(value);
System.out.println(value.length());
}
static String starString(int n) {
String result = "";
if (n > 0) {
result = "*" + starString(n -1);
}
return result;
}
试试这个:
public static String starString(int n) {
if (n < 0) {
throw new IllegalArgumentException("No negative values allowed");
}
if (n == 0) {
return "*";
} else {
int pow = (int) Math.pow(2, n);
int pow2 = pow / 2;
int starsCount = pow - pow2;
StringBuilder stringBuilder = new StringBuilder();
IntStream.iterate(0, operand -> operand + 1)
.limit(starsCount)
.forEach(value -> stringBuilder.append("*"));
return stringBuilder.toString() + starString(n - 1);
}
}
在每一个递归步骤中,我都会计算需要追加多少个星号pow-pow2。这是一个重要的优化,有助于处理像这样昂贵的函数调用;如果从一个表开始,该表在零的情况下包含一个星号,然后在返回输出时填充该表,则不需要为每个步骤重新计算输出。像
private static Map<Integer, String> memo = new HashMap<>();
static {
memo.put(0, "*");
}
public static String starString(int n) {
if (n < 0) {
throw new IllegalArgumentException("No negative values allowed");
} else if (!memo.containsKey(n)) {
final String pre = starString(n - 1);
StringBuilder sb = new StringBuilder(pre.length() * 2);
sb.append(pre).append(pre);
memo.put(n, sb.toString());
}
return memo.get(n);
}
是否只需要使用递归来解决这个问题?是否可以使用辅助函数来调用带有初始参数的递归函数?
private static Map<Integer, String> memo = new HashMap<>();
static {
memo.put(0, "*");
}
public static String starString(int n) {
if (n < 0) {
throw new IllegalArgumentException("No negative values allowed");
} else if (!memo.containsKey(n)) {
final String pre = starString(n - 1);
StringBuilder sb = new StringBuilder(pre.length() * 2);
sb.append(pre).append(pre);
memo.put(n, sb.toString());
}
return memo.get(n);
}
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
String s = starString(i);
System.out.printf("%d: %s%n", s.length(), s);
}
}
1: *
2: **
4: ****
8: ********
16: ****************
32: ********************************
64: ****************************************************************
128: ********************************************************************************************************************************