كيف Reverse خيط في Java باستخدام العودية

⚡ ملخص ذكي

Revإدخال سلسلة في Java تعمل خاصية التكرار عن طريق إزالة الحرف الأول، وعكس ما تبقى، ثم إضافة ذلك الحرف الأول إلى النهاية. أما السلسلة الفارغة فتوقف الاستدعاءات وتعيد ترتيب عناصر المكدس.

  • 🔘 حالة القاعدة: تُنهي الدالة عملها فورًا عندما تُشير الدالة isEmpty() إلى أنه لم يتبق شيء لعكسه.
  • ☑️ خطوة تكرارية: تقوم الدالة substring(1) بإزالة الحرف الأول، وتقوم الدالة charAt(0) بإعادته بعد الباقي المعكوس.
  • ثبات: كل استدعاء ينتج كائن سلسلة نصية جديد، لأن Java لا يمكن تعديل السلسلة النصية في مكانها.
  • 🧪 Trace: Guruيتحول الرقم 99 إلى 99uruG بعد سبع استدعاءات، واحد لكل حرف بالإضافة إلى الحالة الأساسية الفارغة.
  • 🛠️ خيارات أسرع: StringBuilder.reverse() و toCharArray() عبارة عن عملية تبديل مؤشرين تنتهي في تمريرة واحدة.
  • 📌 التكلفة: يتم تنفيذ الاستدعاء الذاتي باستخدام الدالة substring() في وقت تربيعي ويحتفظ بإطار مكدس واحد لكل حرف.

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تم تحويل المكالمة إلى المكالمة التاليةتعبير ينتظر الانتهاء
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString(“99”) + u
5999reverseString(“9”) + 9
69(فارغة)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 في كلا الاتجاهين.

الأسئلة الشائعة

كائنات السلاسل النصية غير قابلة للتغيير، لذا لا يمكن تعديل الأحرف بداخلها بعد إنشائها. وبالتالي، فإن كل عملية عكس تُنشئ كائنًا جديدًا. استخدم StringBuilder أو مصفوفة أحرف عندما يلزم تعديل الأحرف دون الحاجة إلى إنشاء سلسلة نصية جديدة في كل خطوة.

يُطلق الاستدعاء الأول للدالة isEmpty() استثناء NullPointerException، لأن الدالة تُستدعى على لا شيء. لذا، يجب حماية نقطة الدخول بفحص القيمة الفارغة بحيث تُرجع قيمة فارغة أو تُطلق استثناء IllegalArgumentException قبل بدء أي استدعاء ذاتي.

ليس بشكل موثوق. تعمل الدالة charAt() على وحدات ترميز 16 بت، لذا يتم تقسيم الحرف المخزن كزوج بديل، ويظهر النص المعكوس مربعات بديلة. أما الدالة StringBuilder.reverse() فتحافظ على الأزواج البديلة معًا، مما يجعلها الخيار الأكثر أمانًا لنصوص يونيكود.

StringBuilder، في جميع الحالات تقريبًا. كلاهما يعرضان نفس الدالة reverse()، لكن StringBuffer تتم مزامنة كل مكالمة، مما يؤثر على السرعة. اختر سلسلة نصيةBuffer فقط عندما تتم مشاركة مخزن مؤقت واحد بشكل حقيقي بين الخيوط.

قسّم الجملة بناءً على المسافات البيضاء باستخدام الدالة split(” “)، ثمّ تصفّح المصفوفة الناتجة من الفهرس الأخير إلى الأول، وأضف كل كلمة إلى StringBuilder. تبقى الأحرف داخل كل كلمة بترتيبها الأصلي.

يُستخدم إطار مكدس واحد لكل حرف، لذا فإن ظهور خطأ تجاوز سعة المكدس (StackOverflowError) أمر شائع، إذ يكفي عادةً بضعة آلاف من الأحرف. يعتمد الحد الأقصى الدقيق على حجم مكدس خيوط JVM. أي إصدار تكراري يتجنب هذا الحد تمامًا.

يمكن لمساعد الذكاء الاصطناعي قراءة مكدس tracهـ، حدد حالة أساسية مفقودة أو غير قابلة للوصول، واشرح ترتيب فكّ الإطارات. كما يصوغ اختبارات للحالات الحدية للإدخال الفارغ، والمدخل ذي الحرف الواحد، والمدخل الصفري. تحقق من صحة الاستنتاج من خلال تشغيل حقيقي.

نعم. مساعد طيار عادةً ما تُكمل الدالة العكسية بالكامل انطلاقًا من التوقيع فقط، وغالبًا ما تُقدم صيغة StringBuilder أولًا. تحقق من الحالة الأساسية والتعقيد، لأن أقصر اقتراح ليس دائمًا هو المطلوب في التمرين.

تلخيص هذه التدوينة بـ: