کیا آپ کبھی ایسے بظاہر نہ ختم ہونے والے چکر میں پھنس گئے ہیں جہاں کوئی مسئلہ چھوٹے چھوٹے ٹکڑوں میں بٹتا رہتا ہے؟
اگر ایسا ہے تو، آپ تکرار کی دلکش دنیا میں آ چکے ہوں گے۔ اگرچہ یہ سمجھنا مشکل ہو سکتا ہے، فکر نہ کریں! اس پوسٹ میں، ہم تکرار کی اقسام کے بارے میں جاننے کے لیے ایک دلچسپ سفر پر جائیں گے۔
لہذا جب ہم متعدد بار بار آنے والے نقطہ نظر کو تلاش کرتے ہیں تو آگے بڑھیں۔ تکرار کے دلچسپ دائرے میں داخل ہونے کی تیاری کریں اور پیچیدہ مسائل کو حل کرنے میں اس کی قابل ذکر صلاحیت کا مشاہدہ کریں۔
Recursions بالکل کیا ہیں؟
بنیادی الفاظ میں، تکرار ایک طاقتور پروگرامنگ تکنیک ہے جس میں عمل کے دوران خود کو کال کرنے والا فنکشن شامل ہوتا ہے۔ یہ آئینے میں گھورنے اور کسی تصویر کے اندر ایک تصویر کو دیکھنے کے مترادف ہے، جس کے نتیجے میں ایک سیلف ریفرنشل سائیکل ہوتا ہے۔
ہم تکرار کا استعمال کرتے ہوئے بڑے مسائل کو چھوٹے، زیادہ قابل انتظام ذیلی مسائل میں تقسیم کر کے نمٹ سکتے ہیں۔
یہ ایک جیگس کو اکٹھا کرنے کے مترادف ہے، جہاں ایک ٹکڑا مکمل تصویر بنانے کے لیے دوسرے حصوں سے جوڑتا ہے۔ Recursion ہمیں مختلف ان پٹ کے ساتھ ہدایات کے ایک ہی سیٹ کو دہراتے ہوئے ایک خوبصورت اور موثر انداز میں مسائل کو حل کرنے کی اجازت دیتا ہے۔
1-براہ راست تکرار
براہ راست تکرار تکرار کی سب سے بنیادی قسم ہے، جس میں ایک فنکشن خود کو براہ راست کال کرتا ہے۔ یہ ایک مشکل مسئلہ کو چھوٹے ذیلی مسائل میں تقسیم کرتا ہے جب تک کہ ایک بنیادی کیس حاصل نہ ہوجائے، جو ختم ہونے کا باعث بنتا ہے۔
تکرار کرنے والا فنکشن خود کو مختلف ان پٹ کے ساتھ کال کرتا ہے، جس سے ہدایات کے ایک ہی سیٹ کو دہرانے کے قابل بناتا ہے۔ ہر درخواست پہلے والے پر بنتی ہے، آہستہ آہستہ بیس کیس کے قریب ہوتی ہے جس کی وجہ سے تکرار ختم ہوجاتی ہے۔
آئیے اس مثال کو چیک کریں۔
def countdown(n):
if n <= 0:
return
print(n)
countdown(n - 1)
countdown(5)
: پیداوار
5
4
3
2
1
2-بالواسطہ تکرار
بالواسطہ تکرار تکراری راستے میں ایک دلچسپ موڑ کا اضافہ کرتی ہے۔ براہ راست تکرار کے برعکس، جس میں ایک فنکشن شامل ہوتا ہے جو خود کو واضح طور پر کال کرتا ہے، بالواسطہ تکرار میں فنکشن کالز کا سلسلہ شامل ہوتا ہے۔
ایک فنکشن دوسرے کو کال کرتا ہے، جو پھر اصل فنکشن یا کسی دوسرے فنکشن کو کال کرسکتا ہے جو آخر کار اصل پر واپس چلا جاتا ہے۔ فنکشن کالز کا یہ باہم جڑا ہوا جال ایک دلکش رقص پیدا کرتا ہے جس میں کئی فنکشنز ایک مسئلہ کو حل کرنے میں تعاون کرتے ہیں۔
: مثال کے طور پر
def function_A(n):
if n > 0:
print("A:", n)
function_B(n - 1)
def function_B(n):
if n > 0:
print("B:", n)
function_A(n - 1)
function_A(3)
: پیداوار
A: 3
B: 2
A: 1
3- لکیری تکرار
سیدھے راستے سے نیچے سفر پر غور کریں، ایک وقت میں ایک قدم، جب تک کہ آپ اپنے مقصد تک نہ پہنچ جائیں۔ اس ترتیب وار تکنیک کو لکیری تکرار کے ذریعے مجسم کیا گیا ہے، جس میں ایک فنکشن ہر فنکشن کے تکرار میں ایک ہی تکراری کال کرتا ہے۔
ہر تکراری کال کے ساتھ، تکراری عمل ایشو کے سائز کو کم کرکے بیس کیس کے قریب جاتا ہے۔ یہ ایک واضح اور لکیری انداز میں آگے بڑھتا ہے، ایک وقت میں ذیلی مسائل کو حل کرتا ہے جب تک کہ حتمی جواب نہ پہنچ جائے۔
: مثال کے طور پر
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
result = factorial(5)
print(result)
: پیداوار
120
4-درخت کی تکرار
جب ایک فنکشن کئی بار بار آنے والی کالوں میں شاخ بنتا ہے، تو ہم درخت کی تکرار کی دنیا میں داخل ہوتے ہیں۔ درخت کی تکرار میں ایک فنکشن بہت سی تکراری کالیں پیدا کرتا ہے، جن میں سے ہر ایک الگ ذیلی مسئلہ حل کرتا ہے، بالکل اسی طرح جیسے درخت کی شاخیں کرتی ہیں۔
یہ برانچنگ ڈھانچہ کئی راستوں کی بیک وقت تفتیش کرنے کی اجازت دیتا ہے، مؤثر طریقے سے پیچیدہ مسائل کو چھوٹے، باہم منسلک اجزاء میں توڑ دیتا ہے۔
: مثال کے طور پر
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
print(result)
: پیداوار
8
5-Nested Recursion
Nested recursion recursive کائنات میں پیچیدگی کی ایک دلچسپ ڈگری کا اضافہ کرتا ہے۔ تکرار کی اس شکل میں، ایک فنکشن ایک بار بار آنے والی کال کو دوسری تکراری کال کے اندر دلیل کے طور پر شامل کرتا ہے۔
اندرونی تکراری کال اس قدر پر کام کرتی ہے جو بیرونی تکراری کال پر منحصر ہے۔ پیچیدگی ہر نیسٹڈ انووکیشن کے ساتھ بڑھتی ہے، جس کا اختتام نیسٹڈ ریکرسیو کالز کے ایک دلچسپ انداز میں ہوتا ہے۔
: مثال کے طور پر
def nested_recursion(n):
if n > 100:
return n - 10
return nested_recursion(nested_recursion(n + 11))
result = nested_recursion(95)
print(result)
نتیجہ:
91
6-دم کی تکرار
ٹیل ریکریشن تکراری الگورتھم کے لیے ایک اصلاحی تکنیک ہے جو ان کی کارکردگی کو بہتر بنا سکتی ہے۔ تکراری کال ٹیل ریکرشن، میکنگ کے ساتھ فنکشن کی حتمی کارروائی کے طور پر ظاہر ہوتی ہے۔
چونکہ تکراری کال کے بعد کوئی بقایا کارروائیاں نہیں ہیں، اس لیے مرتب کرنے والا یا مترجم اسے ایک سادہ جمپ سے بدل کر تکرار کو آسان بنا سکتا ہے۔
یہ آپٹیمائزیشن اپروچ، جسے ٹیل کال آپٹیمائزیشن کے نام سے جانا جاتا ہے، اسٹیک فریم کو برقرار رکھنے کے لیے ہر بار بار آنے والی کال کی ضرورت کو کم کرتا ہے، جس کے نتیجے میں رفتار میں اضافہ اور میموری کا کم استعمال ہوتا ہے۔
: مثال کے طور پر
def tail_factorial(n, result=1):
if n == 0:
return result
return tail_factorial(n - 1, result * n)
result = tail_factorial(5)
print(result)
آؤٹ آؤٹ:
120
7-غیر دم کی تکرار
ٹیل کی تکرار کے برعکس، نان ٹیل ریکریشن میں فنکشن کے اندر ریکسریو کال کے بعد کی جانے والی اضافی سرگرمیاں شامل ہوتی ہیں۔ اس سے پہلے کہ مزید کارروائیاں کی جائیں، ہر بار بار آنے والی کال کو مکمل کرنا اور واپس آنا چاہیے۔
نتیجے کے طور پر، جب تک بیس کیس تک نہیں پہنچ جاتا اور تکرار ختم نہیں ہو جاتی، بقایا کارروائیوں کا ایک ڈھیر برقرار رہتا ہے۔ غیر دم کی تکرار اکثر زیادہ میموری استعمال کرتی ہے اور دم کی تکرار سے کم موثر ہوتی ہے، لیکن یہ اب بھی متعدد مسائل سے نمٹنے کے لیے ایک مددگار ذریعہ ہے۔
: مثال کے طور پر
def non_tail_sum(n):
if n == 0:
return 0
return n + non_tail_sum(n - 1)
result = non_tail_sum(5)
print(result)
: پیداوار
15
لپیٹ
پروگرامنگ میں تکرار ایک دلچسپ تصور ہے۔ یہ ہمیں پیچیدہ مسائل کو بار بار، خود حوالہ انداز میں حل کرنے کی اجازت دیتا ہے۔
یہ مسائل کے بارے میں سوچنے اور حل کرنے کا ایک الگ طریقہ پیش کرتا ہے، انہیں چھوٹے، زیادہ قابل انتظام حصوں میں تقسیم کرتا ہے۔ تکرار کے ساتھ کام کرتے وقت، تاہم، کچھ نکات پر توجہ دینا ضروری ہے۔
آپ کو مناسب بیس کیسز کی نشاندہی کرنی چاہیے جو تکرار کو ختم ہونے دیتے ہیں۔ اگر وہ موجود نہیں ہیں تو، فنکشن ہمیشہ کے لیے خود کو کال کرنا جاری رکھ سکتا ہے۔
دوسرا، منظر نامے کی بنیاد پر، مناسب قسم کی تکرار کا انتخاب زیادہ موثر اور خوبصورت حل کی طرف لے جا سکتا ہے۔ یہ تلاش کرنے کی کوشش کریں کہ ہاتھ میں موجود مسئلہ کے لیے کیا بہتر کام کرتا ہے۔ وسیع تکرار کی گہرائیوں کے ساتھ کام کرتے وقت، اسٹیک اوور فلو جیسے ممکنہ خطرات سے آگاہ رہیں۔
جواب دیجئے