زیر برنامه ها بازگشت


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

اگر ریاضیات را به خاطر دارید، در آنجا می توانید اصل استقراء ریاضیرا ببینید. به شرح زیر است:

یک عبارت خاص برای هر n if
طبیعی صادق است     1. برای n = 1 و
معتبر است     2. از اعتبار عبارت برای هر طبیعی دلخواه n = k  نتیجه می شود که برای n = k+1
صادق است.
در برنامه نویسی به این تکنیک recursion
می گویند
بازگشت روشی برای تعریف مجموعه ای از اشیا بر اساس خود مجموعه، بر اساس موارد پایه ساده داده شده است.


بازگشتی همچنین رویه (تابع) نامیده می‌شود که مستقیماً یا از طریق سایر رویه‌ها و توابع خود را فراخوانی می‌کند
نمونه ای از یک روش بازگشتی: <پیش> روش Rec(a: integer); شروع     اگر > 0 سپس         Rec(a - 1);     نوشتن (الف)؛ پایان؛ به طور شماتیک، کار بازگشت را می توان با یک نمودار جریان نشان داد

 
رویه Rec() با پارامتر 3 اجرا می شود. سپس در داخل رویه با پارامتر 3، رویه با پارامتر 2 فراخوانی می شود و به همین ترتیب تا زمانی که رویه با پارامتر 0 فراخوانی شود. پارامتر 0 فراخوانی می شود، فراخوانی بازگشتی قبلاً اتفاق نمی افتد و رویه با پارامتر 0 عدد 0 را چاپ می کند و خاتمه می یابد. سپس کنترل به رویه با پارامتر 1 برمی گردد، همچنین با چاپ عدد 1 کار خود را به پایان می رساند و به همین ترتیب. قبل از رویه با پارامتر 3. 

تمام رویه های فراخوانی شده تا زمانی که کار خود را کامل کنند در حافظه ذخیره می شوند. تعداد رویه‌های همزمان عمق بازگشت نامیده می‌شود.

دیده‌ایم که بازگشت، اجرای مکرر دستورالعمل‌های موجود در یک زیر روال است. و این به نوبه خود شبیه کار چرخه است. زبان های برنامه نویسی هستند که ساختار حلقه در آنها اصلا وجود ندارد، به عنوان مثال، Prolog. 
بیایید سعی کنیم عملکرد حلقه for را شبیه سازی کنیم. 
حلقه for شامل یک متغیر شمارنده گام است. در یک زیربرنامه بازگشتی، چنین متغیری می تواند به عنوان یک پارامتر ارسال شود. <پیش> رویه //LoopImitation() با دو پارامتر //پارامتر اول – گام شمار، پارامتر دوم – تعداد کل مراحل Procedure LoopImitation(i, n: integer); شروع     writeln('Hello N ', i); // عملگر برای هر مقدار i تکرار شود     اگر من < n سپس // تا زمانی که شمارنده حلقه برابر با مقدار n شود،         LoopImitation(i + 1, n); // فراخوانی یک نمونه جدید از رویه، با پارامتر i+1 (انتقال به مقدار بعدی i) پایان؛

برای درک بازگشت، باید بازگشت را درک کنید...
 
تکرار در برنامه نویسی — به معنای وسیع — سازماندهی پردازش داده، که در آن اقدامات چندین بار تکرار می‌شوند، بدون اینکه منجر به تماس با خودشان شوند (برخلاف  %BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="Recursion" > بازگشت). به معنای محدود — فرآیند پردازش چرخه ای داده یک مرحله ای. 
اغلب الگوریتم های تکرار شونده در مرحله جاری (تکرار) از نتیجه عملیات یا عمل مشابه محاسبه شده در مراحل قبلی استفاده می کنند.  یک مثال از این محاسبات، محاسبه روابط تکراری است. 
یک مثال ساده از یک مقدار بازگشتی فاکتوریل است: \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\) محاسبه مقدار در هر مرحله (تکرار) \(N=N \cdot i\) است.  هنگام محاسبه مقدار \(N\)، مقدار ذخیره شده از قبل \(N\).< br />
فاکتوریل یک عدد را می توان با استفاده از فرمول بازگشتی نیز توصیف کرد:



ممکن است متوجه شوید که این توضیحات چیزی بیش از یک تابع بازگشتی نیست.
در اینجا خط اول (\(n <= 1\)) — این حالت پایه (شرط پایان بازگشت) و خط دوم انتقال به مرحله بعدی است. 
  <بدن>
یک تابع فاکتوریل بازگشتی به این شکل خواهد بود مقایسه الگوریتم برای یافتن فاکتوریل به روش معمول و غیر بازگشتی
function Factorial(n: integer): عدد صحیح؛
شروع
    اگر n > 1 سپس
        فاکتوریل := n * فاکتوریل(n - 1)
    other
        فاکتوریل := 1;
پایان؛
x := 1;
برای i := 2 تا n انجام
    x := x * i;
writeln(x);

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