Yani döngülerden kaçınmak mı istiyorsunuz?
Bu artık senin:
public static String repeat(String s, int times) {
if (times <= 0) return "";
else return s + repeat(s, times-1);
}
(tabii ki bunun çirkin ve verimsiz olduğunu biliyorum, ama döngüler yok :-p)
Daha basit ve güzel mi istiyorsun? jython kullanın:
s * 3
Düzenleme : biraz optimize edelim :-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 ana alternatif için hızlı ve kirli bir kıyaslama yaptım, ancak araçları almak ve birkaç girdi için zamanları çizmek için birkaç kez çalıştırmak için zamanım yok ... Yani kimse isterse kod dene:
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();
}
}
2 argüman alır, ilki yineleme sayısıdır (her fonksiyon 1..n tekrar süreleri arg ile çalışır) ve ikincisi tekrarlanacak dizedir.
Şimdiye kadar, farklı girdilerle çalışan zamanların hızlı bir şekilde incelenmesi, sıralamayı şu şekilde bırakıyor (daha iyiden kötüye):
- Yinelemeli StringBuilder eki (1x).
- Özyinelemeli birleştirme log2 çağrıları (~ 3x).
- Yinelemeli birleştirme doğrusal çağrıları (~ 30x).
- Yinelemeli birleştirme doğrusal (~ 45x).
Ben özyinelemeli işlev for
döngü daha hızlı olduğunu hiç tahmin etmem : -o
İyi eğlenceler (ctional xD).