সুতরাং আপনি লুপ এড়াতে চান?
এখানে আপনি এটি আছে:
public static String repeat(String s, int times) {
if (times <= 0) return "";
else return s + repeat(s, times-1);
}
(অবশ্যই আমি জানি এটি কুরুচিপূর্ণ এবং অদক্ষ, তবে এর লুপগুলি নেই :- পি)
আপনি এটি সহজ এবং সুন্দর চান? জাইথন ব্যবহার করুন:
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);
}
সম্পাদনা 2 : আমি 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();
}
}
এটি 2 টি আর্গুমেন্ট গ্রহণ করে, প্রথমটি পুনরাবৃত্তির সংখ্যা (প্রতিটি ফাংশন 1..n থেকে পুনরাবৃত্তি বারের সাথে চালিত হয়) এবং দ্বিতীয়টি পুনরাবৃত্তি করার জন্য স্ট্রিং।
এখনও অবধি, বিভিন্ন ইনপুটগুলির সাথে চলমান সময়ের তাত্ক্ষণিক পরিদর্শনটি র্যাঙ্কিংয়ের মতো কিছু ফেলে দেয় (আরও ভাল থেকে খারাপ):
- আইট্রেটিভ স্ট্রিংবিল্ডার অ্যাপেন্ড (1x)।
- পুনরাবৃত্তিমূলক কনটেনটেশন লগ 2 অনুরোধ (~ 3x)।
- রিকার্সিভ কনটেন্টেশন লিনিয়ার ইনভোকেশনস (~ 30x)।
- আইট্রেটিভ কনটেন্টেশন লিনিয়ার (~ 45x)।
আমি কখনও অনুমান করতাম না যে পুনরাবৃত্তির কাজটি for
লুপের চেয়ে দ্রুত ছিল : -ও
মজা করুন (ctional xD)।