루프를 피하고 싶습니까?
여기 있습니다 :
public static String repeat(String s, int times) {
if (times <= 0) return "";
else return s + repeat(s, times-1);
}
(물론 이것은 추악하고 비효율적이지만 루프가 없습니다 :-p)
더 단순하고 예쁘기를 원하십니까? 자이 썬 사용 :
s * 3
편집 : 조금 최적화 해 봅시다 :-D
public static String repeat(String s, int times) {
if (times <= 0) return "";
else if (times % 2 == 0) return repeat(s+s, times/2);
else return s + repeat(s+s, times/2);
}
Edit2 : 4 가지 주요 대안에 대해 빠르고 더러운 벤치 마크를 수행했지만 평균을 얻기 위해 여러 번 실행하고 여러 입력에 대한 시간을 계획 할 시간이 없습니다 ... 그래서 누군가가 원한다면 코드는 다음과 같습니다. 시도해보십시오.
public class Repeat {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
String s = args[1];
int l = s.length();
long start, end;
start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
if(repeatLog2(s,i).length()!=i*l) throw new RuntimeException();
}
end = System.currentTimeMillis();
System.out.println("RecLog2Concat: " + (end-start) + "ms");
start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
if(repeatR(s,i).length()!=i*l) throw new RuntimeException();
}
end = System.currentTimeMillis();
System.out.println("RecLinConcat: " + (end-start) + "ms");
start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
if(repeatIc(s,i).length()!=i*l) throw new RuntimeException();
}
end = System.currentTimeMillis();
System.out.println("IterConcat: " + (end-start) + "ms");
start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
if(repeatSb(s,i).length()!=i*l) throw new RuntimeException();
}
end = System.currentTimeMillis();
System.out.println("IterStrB: " + (end-start) + "ms");
}
public static String repeatLog2(String s, int times) {
if (times <= 0) {
return "";
}
else if (times % 2 == 0) {
return repeatLog2(s+s, times/2);
}
else {
return s + repeatLog2(s+s, times/2);
}
}
public static String repeatR(String s, int times) {
if (times <= 0) {
return "";
}
else {
return s + repeatR(s, times-1);
}
}
public static String repeatIc(String s, int times) {
String tmp = "";
for (int i = 0; i < times; i++) {
tmp += s;
}
return tmp;
}
public static String repeatSb(String s, int n) {
final StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
sb.append(s);
}
return sb.toString();
}
}
두 개의 인수가 필요합니다. 첫 번째는 반복 횟수 (각 함수는 1..n의 반복 시간으로 실행 됨)이고 두 번째는 반복 할 문자열입니다.
지금까지 다른 입력으로 실행되는 시간을 빠르게 검사하면 다음과 같은 순위가 유지됩니다.
- 반복적 인 StringBuilder 추가 (1x).
- 재귀 연결 log2 호출 (~ 3x).
- 재귀 연결 선형 호출 (~ 30x).
- 반복 연결 선형 (~ 45x).
재귀 함수가 for
루프 보다 빠르다고 추측하지 못했습니다 .
재미있게 보내십시오 (actal xD).