فصل 26: متدهای بازگشتی و بحث درباره Call by value یا Call by reference جاوا

03 شهریور 1397
return-methods-in-java

در جاوا به متدهایی که هنگام اجرا خودشان را پیوسته صدا بزنند، متد بازگشتی می گویند. استفاده از متدهای بازگشتی باعث نوشتن کدهای کوتاه تر اما پیچیده تر می شود.

سینتکس:

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 reference؟

جاوا در واقع 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
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.