Java 使用递归将字符串打印n次

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);

我在下列练习中遇到困难

编写一个方法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);  "********"          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: ********************************************************************************************************************************