كيف Reverse خيط في Java باستخدام العودية
⚡ ملخص ذكي
Revإدخال سلسلة في Java تعمل خاصية التكرار عن طريق إزالة الحرف الأول، وعكس ما تبقى، ثم إضافة ذلك الحرف الأول إلى النهاية. أما السلسلة الفارغة فتوقف الاستدعاءات وتعيد ترتيب عناصر المكدس.
في هذا البرنامج المثال، سنقوم بعكس سلسلة أدخلها المستخدم.
سنقوم بإنشاء دالة لعكس سلسلة. Later سنستدعي الدالة بشكل متكرر حتى يتم عكس جميع الأحرف. يناسب التكرار هذه المشكلة لأن السلسلة المعكوسة هي ببساطة الجزء المعكوس من السلسلة مع بقاء الحرف الأول الأصلي في النهاية، وهي نفس المشكلة ولكن بحرف أصغر.
اكتب Java برنامج ل Reverse خيط
يُعرّف الصنف أدناه المدخلات في الدالة main()، ثم يُمررها إلى الدالة reverseString()، ويطبع الناتج. يُظهر استدعاء الدالة println() مرتين داخل الدالة كل خطوة تكرارية في وحدة التحكم.
package com.guru99; public class ReverseString { public static void main(String[] args) { String myStr = "Guru99"; //create Method and pass and input parameter string String reversed = reverseString(myStr); System.out.println("The reversed string is: " + reversed); } //Method take string parameter and check string is empty or not public static String reverseString(String myStr) { if (myStr.isEmpty()){ System.out.println("String in now Empty"); return myStr; } //Calling Function Recursively System.out.println("String to be passed in Recursive Function: "+myStr.substring(1)); return reverseString(myStr.substring(1)) + myStr.charAt(0); } }
Code الإخراج:
كل سطر من المخرجات يمثل استدعاءً تكراريًا واحدًا. الجزء المطبوع في نهاية كل سطر أقصر بحرف واحد من السطر الذي يسبقه، ويُظهر السطر الأخير النتيجة المعكوسة.
String to be passed in Recursive Function: uru99 String to be passed in Recursive Function: ru99 String to be passed in Recursive Function: u99 String to be passed in Recursive Function: 99 String to be passed in Recursive Function: 9 String to be passed in Recursive Function: String in now Empty The reversed string is: 99uruG
كيف التكرار Revالأعمال العامة خطوة بخطوة
يتكون الأسلوب بأكمله من سطرين. تُحدد حالة الأساس، if (myStr.isEmpty())، نقطة توقف للتكرار. أما سطر التكرار، return reverseString(myStr.substring(1)) + myStr.charAt(0)، فيقسم العمل إلى قسمين: substring(1) هو كل ما يلي الحرف الأول، وcharAt(0) هو ذلك الحرف الأول مضافًا إليه بعد الباقي المعكوس.
Tracإدخال Guruالرقم 99 يوضح الترتيب. Java يقوم بدفع إطار واحد لكل استدعاء قبل حدوث أي عملية دمج:
| اتصل | myStr | تم تحويل المكالمة إلى المكالمة التالية | تعبير ينتظر الانتهاء |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(“uru99”) + G |
| 2 | uru99 | ru99 | reverseString(“ru99”) + u |
| 3 | ru99 | u99 | reverseString(“u99”) + r |
| 4 | u99 | 99 | reverseString(“99”) + u |
| 5 | 99 | 9 | reverseString(“9”) + 9 |
| 6 | 9 | (فارغة) | reverseString(“”) + 9 |
| 7 | (فارغة) | تم الوصول إلى الحالة الأساسية | يُرجع سلسلة نصية فارغة |
ثم ينفك المكدس من الأسفل إلى الأعلى، ويضيف كل إطار الحرف المحفوظ: تصبح السلسلة الفارغة 9، ثم 99، ثم 99u، ثم 99ur، ثم 99uru، وأخيراً 99uruG. لان Java السلاسل النصية غير قابلة للتغيير، ولا تقوم أي من هذه القيم الوسيطة بالكتابة فوق القيمة السابقة - كل عملية دمج تقوم بتخصيص كائن سلسلة نصية جديد.
هناك تفصيلان في مخرجات وحدة التحكم جديران بالذكر. ينتهي السطر السادس بدون أي شيء بعد النقطتين، لأن الدالة substring(1) على سلسلة نصية مكونة من حرف واحد تُرجع سلسلة نصية فارغة بدلاً من القيمة null. الرسالة التي تليها هي "String in now Empty" في البرنامج الأصلي؛ هذه الصياغة خطأ مطبعي، والصحيح هو "String is now empty"، وقد تُركت كما هي دون تغيير حتى يظل الكود والمخرجات أعلاه متطابقين سطرًا بسطر.
طرق أخرى ل Reverse خيط في Java
التكرار هو أوضح طريقة لـ انظر تعريف قد يحدث العكس، لكن نادرًا ما يكون هذا هو الأسلوب المُتبع في كود الإنتاج. ثلاثة بدائل تُغطي تقريبًا جميع الحالات الواقعية.
1. StringBuilder.reverse() هي الأقصر والأسرع. تحتوي الفئة على دالة reverse() مدمجة، لذا يمكن تنفيذ المهمة بأكملها في سطر واحد:
String reversed = new StringBuilder(myStr).reverse().toString();
2. حلقة تكرارية (for loop) مع الدالة charAt() يتتبع هذا الأمر السلسلة عكسيًا من آخر فهرس إلى الصفر. غالبًا ما يطلب القائمون على المقابلات هذا الإصدار لأنه يُظهر المنطق بدلًا من تفويضه.
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. عملية تبديل مؤشرين باستخدام الدالة toCharArray() يقوم بتحويل السلسلة إلى مصفوفة أحرف، ثم يبدل الأحرف الخارجية إلى الداخل حتى تلتقي المؤشرات في المنتصف:
char[] chars = myStr.toCharArray(); int left = 0; int right = chars.length - 1; while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } String reversed = new String(chars);
تُستخدم نفس تقنية المصفوفات لعكس التسلسل الرقمي أو أي مجموعة مرتبة أخرى، ولهذا السبب تظهر في Java مجموعة تمارين بنفس عدد مرات تمارين الأوتار.
تعقيد الزمان والمكان لكل نهج
لا تتساوى تكلفة النسخ الأربع. يشترك كلا المدخلين التربيعيين أدناه في سبب واحد: إنهما يُنشئان سلسلة نصية جديدة تمامًا في كل خطوة، ونسخ n حرفًا n مرة يتطلب عملًا مقداره n تربيع.
| النهج | الوقت: | مساحة إضافية | لماذا |
|---|---|---|---|
| التكرار باستخدام دالة substring() | س (ن²) | س (ن²) | تقوم الدالة substring() بنسخ الأحرف المتبقية في كل استدعاء، ويتم الاحتفاظ بإطار مكدس واحد لكل حرف. |
| حلقة for مع charAt() و+ | س (ن²) | س (ن²) | تُخصص كل عملية دمج سلسلة نصية جديدة وتنسخ كل ما تم جمعه حتى الآن |
| StringBuilder.reverse() | O (ن) | O (ن) | مخزن مؤقت واحد قابل للتغيير، تمريرة واحدة، ويتم الاحتفاظ بالأزواج البديلة سليمة |
| مؤشران على toCharArray() | O (ن) | O (ن) | نسخ مصفوفة واحدة، ثم n/2 عملية تبديل بدون تخصيص إضافي |
اختر النسخة التكرارية للتعلم أو لتوضيح كيفية عمل مكدس الاستدعاءات، ونسخة مصفوفة الأحرف عندما يطلب منك المُحاور كتابة المنطق يدويًا، واستخدم StringBuilder.reverse() في أي برنامج يُشحن. يظهر نفس التوازن بين الحل التعليمي والحل الإنتاجي في التمارين الكلاسيكية، بدءًا من فقاعة الفرز و مبادئ السلوك سلسلة فيبوناتشي إلى التحقق من الأعداد الأوليةكل واحدة منها تستحق التدرب عليها Java في كلا الاتجاهين.
