بازگشتی (Recursion)
بازگشتی جاوا یعنی متد خودش را صدا بزند. بازگشتی (Recursion) مسئله بزرگ را به مسئله های کوچک تر تبدیل می کند. مثل حل تمرین طولانی، ولی مرحله به مرحله.
بازگشتی جاوا در یک نگاه
در بازگشت، متد خودش را دوباره فراخوانی می کند. این کار مسئله را ساده تر می کند تا جواب برسد.
مثال: جمع از 1 تا 10
با بازگشت، جمع بازه را به جمع های کوچک تبدیل می کنیم.
public class Main {
public static int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
public static void main(String[] args) {
int result = sum(10);
System.out.println(result);
}
}
نکته: وقتی k به صفر برسد، دیگر خودش را صدا نمی زند. برنامه همان جا متوقف می شود.
شرط توقف (Halting Condition)
اگر شرط توقف نگذاریم، بازگشت بی نهایت می شود. بنابراین باید جایی بازگشت تمام شود.
public class Main {
public static int sum(int start, int end) {
if (end > start) {
return end + sum(start, end - 1);
} else {
return end;
}
}
public static void main(String[] args) {
int result = sum(5, 10);
System.out.println(result);
}
}
هشدار: شرط توقف اشتباه، برنامه را گیر می اندازد یا حافظه زیاد می گیرد.
شمارش معکوس بازگشتی
اینجا هر بار یکی کم می کنیم تا به صفر برسیم.
public class Main {
static void countdown(int n) {
if (n > 0) {
System.out.print(n + " ");
countdown(n - 1);
}
}
public static void main(String[] args) {
countdown(5);
}
}
فاکتوریل با بازگشت
فاکتوریل یعنی عدد را در همه اعداد کوچکتر ضرب کنیم.
public class Main {
static int factorial(int n) {
if (n > 1) {
return n * factorial(n - 1);
} else {
return 1;
}
}
public static void main(String[] args) {
System.out.println("Factorial of 5 is " + factorial(5));
}
}
گام های عملی
- یک متد بازگشتی با شرط توقف بساز.
- با ورودی های مختلف تست کن.
- اگر گیر کرد، شرط توقف را اصلاح کن.
نکته: برای مرور بیشترِ بازگشتی جاوا این صفحه را ذخیره کن. همچنین اسکوپ و متدها را ببین.
جمع بندی سریع
- بازگشت یعنی فراخوانی دوباره خود متد.
- حتماً شرط توقف بگذار.
- مسئله بزرگ را کوچک کن.
- ورودی های مرزی را تست کن.
- خروجی را مرحله ای بررسی کن.