使用递归打印字符串n次

时间:2019-05-11 17:46:38

标签: java recursion

我在以下练习中遇到麻烦。

编写一个方法starString,它接受一个整数参数n并返回一个2n长(即2等于n次幂)的星号(星号)。例如:

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。

我已经尝试过了,但是我正在寻找一种将字符串“ *”相乘多次的方法。 PD:我不能使用.repeat

我一直坚持将2的值乘以n次方。正如我尝试过的

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

}
test #1:starString(0)
return:"*"
result: pass

test #2:starString(1)
return:"**"
result: pass

test #3:starString(2)
expected return:"****"
your return:"***"
result: fail

test #4:starString(3)
expected return:"********"
your return:"****"
result: fail

test #5:starString(4)
expected return:"****************"
your return:"*****"
result: fail

test #6:starString(-1)
exp. exception:IllegalArgumentException
your exception:IllegalArgumentException on line 3: No negative values allowed
result: pass

4 个答案:

答案 0 :(得分:3)

这将起作用,尽管它会炸毁较大的n。

public static Page<TRet> PagedFetch<T1, T2, TRet>(this PetaPoco.IDatabase db, long page, long itemsPerPage, Func<T1, T2, TRet> cb, string sql, params object[] args)
        {
            SQLParts parts;
            if (!db.Provider.PagingUtility.SplitSQL(sql, out parts))
                throw new Exception("Unable to parse SQL statement for paged query");

            db.Provider.BuildPageQuery((page - 1) * itemsPerPage, itemsPerPage, parts, ref args);

            sql = string.Format("{0} offset {1} rows fetch next {2} rows only", sql, (page - 1) * itemsPerPage, itemsPerPage);

            var data = db.Fetch(cb, sql, args);

            var result = new Page<TRet>
            {
                Items = data,
                TotalItems = db.ExecuteScalar<long>(parts.SqlCount),
                CurrentPage = page,
                ItemsPerPage = itemsPerPage
            };

            result.TotalPages = result.TotalItems / itemsPerPage;

            if ((result.TotalItems % itemsPerPage) != 0)
                result.TotalPages++;

            return result;
        }

很显然,您可以使用来获得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(n-1) + starString(n-1);
    }

}

答案 1 :(得分:0)

您可以这样做

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

答案 2 :(得分:0)

尝试一下:

     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)

答案 3 :(得分:0)

memoization是可以帮助完成昂贵的函数调用的一项重要优化。如果从零开始时包含一个星的表开始,然后在返回输出时填充该表,则不需要为每一步都重新计算输出。喜欢,

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: ********************************************************************************************************************************