متد های بازگشتی و کاربرد آن ها در جاوا

 

مفهوم بازگشتی در جاوا

بازگشتی به مفهومی گفته می شود، که در آن متدی خودش را فراخوانی کند. متد ها می توانند خودشان را به صورت مستقیم و غیر مستقیمفراخوانی کنند.

در روش مستقیم یکی از دستورات موجود در بدنه متد فراخوانی خودش است. اما در روش غیر مستقیم مثلا متد f1 متذ f2 را فراخوانی می کند و f1 دوباره توسط f2 خودش را فراخوانی می کند. کد زیر را ببینید :

 

int m1(int n) {
    n++;
    m1(n);
}

 

در این کد متد m1 فراخوانی خودش را مستقیم از بدنه متد خودش، انجام می دهد.در اینجا یک حلقه بی نهایت صورت می گیرد و متد در یک پروسه بدون خاتمه قرار می گیرد. بنابر این متد های بازگشتی باید یک شرط برای توقف داشته باشند.

بنابراین طرح کلی الگوریتم های بازگشتی به صورت زیر است

  • یک یا چند حالت که در آن متد، وظیفه خودش را به صورت بازگشتی انجام می دهد. یعنی این حالت ها خاصیت بازگشتی دارند.
  • یک یا چند حالت که در آن، متد وظیفه خودش را بدون فراخوانی بازگشتی انجام می دهد. این حالت را حالت های توقف یا stop cases گویند.

اغلب برای اینکه فراخوانی های بازگشتی یک جا به پایان برسند، از دستور if استفاده می شود که حلقه های بی نهایت ایجاد نشود.

 

if (به حالت توقف رسیدی) {
    مسئله حالت توقف را حل کن
} else {
    تابع را بار دیگر فراخوانی کن
}

 

مفهوم بازگشتی ابزاری قدرتمند برای برنامه نویسان است و درک آن برای برنامه نویس میتدی قدری دشوار است. با مثالی به درک بهتر آن می پردازیم و جنبه های تکنیکی آن را مورد بحث قرار نمی دهیم.

یک مثال خوب برای یادگیری مفهوم بازگشتی فاکتوریل  می باشد.

 

if n = 0 then n! = 1 
if n > 0 then n! = 1 * 2 * 3 * ... * (n-1) * n

 

بر اساس این تعریف داریم :

 

4! = 3! * 4

 

در واقع برای هر n > 0 داریم :

 

n! = n * (n-1)!

 

این تعریف، فاکتوریل را بر حسب خودش تعریف می کند. یعنی فاکتوریل هر عدد، باید با فاکتوریل عدد قبلی اش محاسبه شود. لذا برای محاسبه فاکتوریل عدد 3، باید فاکتوریل عدد 2 را محاسبه کنیم، برای محاسبه فاکتوریل عدد 2 باید فاکتوریل عدد 1 را محاسبه کنیم، و الی آخر تا به فاکتوریل 0 برسیم.

این مکانیزم، مسئله بازگشتی ایجاب می کند. روند زیر، محاسبه می شود

 

3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1

 

خودت بنویس : برنامه ایی که یک عدد صحیح از ورودی بگیرد و فاکتوریل آن را محاسبه کند

 

import java.util.*;
 
public class example_6 {
    static Scanner scnr = new Scanner(System.in);
    public static void main(String[] args) {
        int n = 0;
        System.out.print("Enter a number : ");
        n = scnr.nextInt();
        System.out.println("fact(" + n + ") = " + fact(n) );
    }
     
    public static long fact(int n) {
        if (n != 0) {
            return n * fact (n-1);
        }
        return 1;
    }
}

 

 

می توانید انتشار قسمت ها جدید آموزش برنامه نویسی و به روز رسانی های جدید سایت را از کانال تلگرام ما دنبال کنید  و یا از قسمت انتهایی سایت ، آدرس it3du را در سایر شبکه های اجتماعی پیدا کنید

 

 

منبع: it3du