بازگشت نتیجه دار چگونه انجام می گیرد ؟
بازگشت نتیجه دار چگونه انجام می گیرد ؟
تاکنون، تنها زیرمجموعۀ کوچکی از پایتون را آموختهاید اما شاید جالب باشد که بدانید این زیر مجموعۀ کوچک یک زبان برنامهنویسی کامل است. یعنی بهوسیلۀ این زبان میتوانید هر چیـزي را کـه قابل محاسبه است، بیان کنید. هـر برنامـهاي کـه تـاکنون نوشـته شـده مـیتوانـد تنهـا بـا اسـتفاده از ویژگی هایی از زبان که تا این زمان آموختهاید بازنویسی شـود. (در واقـع، شـما بـه تعـداد محـدودي از دستورات نیاز دارید تا بتوانید واحدهایی همچون صفحه کلید، ماوس، دیسکها و . . . را کنتـرل کنیـد. اما این آخر ماجرا است!) اثبات این ادعا که اولین بار توسط «آلن تورینگ» انجام شده، تمرین قابل توجهی است (او یکی از اولین دانشمندان علم کامپیوتر اسـت. علـیرغـم اینکـه بعضـی عقیـده دارنـد «آلـن تورینـگ» یـک ریاضیدان است اما بسیاري از دانشمندان اولیۀ علم کامپیوتر با ریاضیات شروع کردنـد). بنـابراین از آن به عنوان فرضیۀ تورینگ یاد میشود. اگر در جریان فرضیۀ محاسبات هستید، شانس دیدن اثبـات آن را خواهید داشت. براي اینکه به شما ایدهاي بدهیم که با ابزارهایی که تاکنون آموختهاید چه کارهـایی مـیتوانیـد انجام دهید، تعدادي از توابع ریاضی تعریف شده به حالـت بازگشـتی را ارزیـابی خـواهیم کـرد. تعریـف بازگشتی، شبیه یک تعریف حلقوي است. به این مفهوم که تعریف، شامل ارجاعی است به چیزهایی کـه تعریف شدهاند. یک تعریف حلقوي واقعی چندان مفید نیست: frabjuous :صفتی است براي شرح هر چیزي که frabjuous باشد !
این تعریف میگوید فاکتوریل عدد 0 ،1 است و فاکتوریل هر مقدار n برابر است با ضـرب n در فاکتوریل 1-n .بنابراین !3 برابر است با 3 تا !2 که خود برابر 2 تا !1 و آن هم برابر 1 در !0 اسـت. لذا نتیجه برابر 6 میباشد. اگر بتوانید تابع بازگشتیِ چیزي را بنویسید، معمولاً مـیتوانیـد یـک برنامـۀ پـایتون هـم بـراي ارزیابی آن بنویسید. اولین گام، مشخص کردن پارامترهاي تابع است. با تلاشی جزئـی متوجـه خواهیـد شد که factorial یک پارامتر میگیرد:
:(def factorial(n
اگر مقدار آرگومان تابع 0 باشد، کافی است 1 را بازگردانیم:
(:def factorial(n
if n == 0:
return 1
در غیر این صورت (این قسمت جالب برنامه است) ما باید یک فراخـوانی بازگشـتی بـراي پیـدا کردن فاکتوریلِ 1-n بسازیم و سپس آن را در n ضرب کنیم:
def factorial(n):
if n == 0:
return 1
else:
recurse = factorial(n-1)
result = n * recurse
return result
روند اجراي این برنامه شبیه به رونـد تـابع countdown در بخـش 4-9 اسـت. اگـر مـا تـابع فاکتوریل را با مقدار 3 صدا بزنیم: از آنجا که 3 مخالف 0 است، شاخۀ دوم را دنبال میکنیم که محاسبۀ مقدار فاکتوریل 1-n است. از آنجا که 2 مخالف 0 است، شاخۀ دوم را دنبال میکنیم کـه محاسـبۀ مقـدار فاکتوریـل 1-n است. از آنجا که 1 مخالف 0 است، شاخۀ دوم را دنبال میکنیم که محاسبۀ مقـدار فاکتوریـل
است n-1 از آنجا که 0 با 0 مساوي است، شاخۀ اول را دنبـال مـیکنـیم کـه برگردانـدن مقدار 1 بدون هیچ فراخوانی بازگشتی دیگر است. مقدار برگشتی (1 ( در n ، که برابر بـا 1 مـیباشـد، ضـرب شـده و نتیجـه بازگردانـده میشود. مقدار برگشتی (1 ( در n ، که برابر با 2 میباشد، ضرب شده و نتیجه بازگردانده میشود. مقدار برگشتی (2 ( در n ، که برابر با 3 میباشد، ضرب شده و 6 را نتیجه میدهد. مقدار بازگشـتی بـه اولین تابعی که فراخوانی شده باز میگردد. تحویل مقادیر بازگشتی به پشتۀ بالایی در نمودار توسط پیکانهایی نمایش داده شدهاند. در هر قاب مقدار بازگشتی result است که بهوسیلۀ n و recurse تولید شده است. توجه کنیـد کـه در قاب آخر متغیرهاي محلی recurse و result وجود ندارند، زیرا شاخۀ سازندة آنها اجرا نمیشود.
برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید