در جاوا به متدهایی که هنگام اجرا خودشان را پیوسته صدا بزنند، متد بازگشتی می گویند. استفاده از متدهای بازگشتی باعث نوشتن کدهای کوتاه تر اما پیچیده تر می شود.
سینتکس:
returntype methodname(){ //code to be executed methodname();//calling same method }
در ادامه چندین مثال متفاوت که از متدهای بازگشتی در آنها استفاده میشود خواهیم دید:
مثال:
public class RecursionExample1 { static void p(){ System.out.println("hello"); p(); } public static void main(String[] args) { p(); } }
خروجی:
hello hello ... java.lang.StackOverflowErro
حال همان مثال بالا را برای تعداد محدودی دفعه بازنویسی می کنیم:
مثال:
public class RecursionExample2 { static int count=0; static void p(){ count++; if(count<=5){ System.out.println("hello "+count); p(); } } public static void main(String[] args) { p(); } }
خروجی:
hello 1 hello 2 hello 3 hello 4 hello 5
مثال محاسبه فاکتوریل اعداد:
public class RecursionExample3 { static int factorial(int n){ if (n == 1) return 1; else return(n * factorial(n-1)); } public static void main(String[] args) { System.out.println("Factorial of 5 is: "+factorial(5)); } }
خروجی:
Factorial of 5 is: 120
مثال چاپ سری فیبوناچی:
public class RecursionExample4 { static int n1=0,n2=1,n3=0; static void printFibo(int count){ if(count>0){ n3 = n1 + n2; n1 = n2; n2 = n3; System.out.print(" "+n3); printFibo(count-1); } } public static void main(String[] args) { int count=15; System.out.print(n1+" "+n2);//printing 0 and 1 printFibo(count-2);//n-2 because 2 numbers are already printed } }
خروجی:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
جاوا در واقع Call by value است. در صورتی که یک متد، یک عدد یا ارزش را به عنوان ورودی خود قبول کند و تغییرات ایجاد شده در آن متد به گونهای لوکال باشد، می گوییم Call by value.
بگذارید چند مثال از Call by value ببینیم:
مثال:
class Operation{ int data=50; void change(int data){ data=data+100;//changes will be in the local variable only } public static void main(String args[]){ Operation op=new Operation(); System.out.println("before change "+op.data); op.change(500); System.out.println("after change "+op.data); } }
خروجی:
Output:before change 50 after change 50
در مثال بالا، مقدار اورجینال ما تغییر نکرده است.
به طور کلی در حالت Call by reference مقدار اریجینال تغییر می کند. در صورتی که شی خود را به عنوان یک مقدار اولیه به متد پاس بدهیم آنگاه مقدار اوریجینال تغییر پیدا می کند. به مثال زیر دقت کنید:
مثال:
class Operation2{ int data=50; void change(Operation2 op){ op.data=op.data+100;//changes will be in the instance variable } public static void main(String args[]){ Operation2 op=new Operation2(); System.out.println("before change "+op.data); op.change(op);//passing object System.out.println("after change "+op.data); } }
خروجی:
Output:before change 50 after change 150
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.