Recursion: base case and recursive case · التراجع: الحالة الأساسية والحالة المتراجعة
A method that calls itself
- Recursion is when a method calls itself to solve a smaller piece of the same problem.
- On the AP CSA exam you mostly trace recursion (follow the calls by hand). Writing small recursive methods helps you trace well.
- Every recursive method needs two parts: a base case and a recursive case.
طريقة تستدعي نفسها
- الاستدعاء الذاتي هو عندما تقوم الطريقة باستدعاء نفسها لحل جزء أصغر من نفس المشكلة.
- في امتحان AP CSA، تتتبع الاستدعاء الذاتي في الغالب (تابع الاستدعاءات يدويًا). كتابة طرق استدعاء ذاتي صغيرة تساعدك على التتبع بشكل جيد.
- كل طريقة استدعاء ذاتي تحتاج جزأين: حالة أساسية وحالة استدعاء ذاتي.
Base case and recursive case
- Base case: the simplest input, where you return an answer without calling yourself. This stops the recursion.
- Recursive case: you call the same method with a smaller input, then build the answer.
- Without a base case, the method calls forever and crashes (a stack overflow).
الحالة الأساسية والحالة المتراجعة
- الحالة الأساسية: أبسط إدخال، حيث تعيد إجابة بدون استدعاء نفسك. هذا يوقف الاستدعاء الذاتي.
- حالة الاستدعاء الذاتي: تستدعي نفس الطريقة بإدخال أصغر، ثم تبني الإجابة.
- بدون حالة أساسية، ستستدعي الطريقة نفسها إلى ما لا نهاية وتتسبب في انهيار ( overflow في المكدس ).
Example: factorial
factorial(n)meansn * (n-1) * ... * 1. For examplefactorial(4) = 24.- Base case:
factorial(1)is1. - Recursive case:
factorial(n)isn * factorial(n - 1).
مثال: المضروب
factorial(n)يعنيn * (n-1) * ... * 1. على سبيل المثالfactorial(4) = 24.- الحالة الأساسية:
factorial(1)تساوي1. - الحالة التكرارية:
factorial(n)هيn * factorial(n - 1).
public class Recursion {
public static int factorial(int n) {
if (n <= 1) { // base case
return 1;
}
return n * factorial(n - 1); // recursive case
}
}
How the calls unwind
- Each call waits for the smaller call to finish. Then it multiplies and returns.
- Trace
factorial(3). Calls go down, then answers come back up.
كيف تنحني الاستدعاءات
- كل استدعاء ينتظر انتهاء الاستدعاء الأصغر. ثم يقوم بالضرب والإرجاع.
- تتبع
factorial(3). تذهب الاستدعاءات لأسفل، ثم تعود الإجابات لأعلى.
factorial(3) = 3 * factorial(2) <- waits
factorial(2) = 2 * factorial(1) <- waits
factorial(1) = 1 <- base case, returns 1
factorial(2) = 2 * 1 = 2 <- returns 2
factorial(3) = 3 * 2 = 6 <- returns 6
Example: sum to n
sumTo(n)adds1 + 2 + ... + n. For examplesumTo(4) = 10.- Base case:
sumTo(0)is0(nothing to add). - Recursive case:
sumTo(n)isn + sumTo(n - 1).
مثال: المجموع حتى n
sumTo(n)يضيف1 + 2 + ... + n. على سبيل المثالsumTo(4) = 10.- الحالة الأساسية:
sumTo(0)هي0(لا يوجد ما يضاف). - الحالة التكرارية:
sumTo(n)هيn + sumTo(n - 1).
public class Recursion {
public static int sumTo(int n) {
if (n <= 0) { // base case
return 0;
}
return n + sumTo(n - 1); // recursive case
}
}
Recursion over an array
- We can also recurse with an index that moves toward the end.
- Base case: when the index is past the last spot, return
0. - Recursive case: add
a[i]to the sum of the rest,arraySum(a, i + 1).
التكرار عبر مصفوفة
- يمكننا أيضاً استخدام التكرار مع مؤشر يتجه نحو النهاية.
- الحالة الأساسية: عندما يكون المؤشر خلف آخر عنصر، أرجع
0. - الحالة التكرارية: أضف
a[i]إلى مجموع الباقي،arraySum(a, i + 1).
- To sum the whole array you start at index
0:arraySum(a, 0). - Each call handles one value and trusts the next call for the rest.
public class Recursion {
public static int arraySum(int[] a, int i) {
if (i >= a.length) { // base case: past the end
return 0;
}
return a[i] + arraySum(a, i + 1);
}
}
- لجمع المصفوفة بأكملها، ابدأ من الفهرس
0:arraySum(a, 0). - كل استدعاء يعالج قيمة واحدة ويثق بالاستدعاء التالي للباقي.
Common mistakes
- Recursion needs a base case, or it throws StackOverflowError.
- Each call must move closer to the base case.
أخطاء شائعة
- يحتاج التكرار إلى حالة أساسية، وإلا سيُطلق StackOverflowError.
- يجب أن يتحرك كل استدعاء نحو الحالة الأساسية.
Now you try
- Each task gives you a method skeleton with a TODO. Write the base case and the recursive case.
- A hidden Harness calls your method with several values and checks the result.
- Press Run to compile, then Check answer.
الآن جرب بنفسك
- كل مهمة تعطيك هيكلاً لطريقة مع TODO. اكتب الحالة الأساسية والحالة التكرارية.
- مختبر مخفي يستدعي طريقتك بقيم متعددة ويتحقق من النتيجة.
- اضغط تشغيل للتجميع، ثم فحص الإجابة.
Recursion: base + recursive case · التراجع: الحالة الأساسية + الحالة المتراجعة
Calls split until a base case, then answers return up. · الأدوات تنقسم حتى الحالة الأساسية، ثم تعود الإجابات للأعلى.
Complete factorial(int n) so it returns n * (n-1) * ... * 1 using recursion. Use a base case for n <= 1. The checker tests several values. · أكمل factorial(int n) لإرجاع n * (n-1) * ... * 1 باستخدام التراجع. استخدم حالة أساسية لـ n <= 1. يختبر الفاحس عدة قيم.
Click Run to see the output here. · اضغط تشغيل لرؤية المخرجات هنا.
Complete sumTo(int n) so it returns 1 + 2 + ... + n using recursion. Use a base case for n <= 0. The checker tests several values. · أكمل sumTo(int n) لإرجاع 1 + 2 + ... + n باستخدام التراجع. استخدم حالة أساسية لـ n <= 0. يختبر الفاحس عدة قيم.
Click Run to see the output here. · اضغط تشغيل لرؤية المخرجات هنا.
Complete arraySum(int[] a, int i) so it returns the sum of a[i] to the end, using recursion. Base case: when i is past the last spot, return 0. The checker tests several arrays. · أتمم arraySum(int[] a, int i) بحيث تُرجع مجموع a[i] إلى النهاية، باستخدام الاستدعاء الذاتي. الحالة الأساسية: عندما يكون i بعد آخر موقع، أرجع 0. يختبر الفاحص عدة مصفوفات.
Click Run to see the output here. · اضغط تشغيل لرؤية المخرجات هنا.