اینکه توی این تابع بازگشتی چرا 4 بار تابع رو فراخونی گرده در حالی که همون یکبار باید کفایت میکرد( البته توی زبان های C و C++ و پاسکال یک بار می نوشتیم)
fmt.Println(f(), f(), f(), f(), f())
سلام، چیزی که اینجا باید بهش دقت کرد مقداری هست که return برگشت میده. عبارت return در تابع fib حاصل
محاسبه رو برگشت نمیده!! این عبارت داره یک «تابع بی نام» رو برگشت میده (صفحه ۴۶ از کتابچه) و در متغیر
f میریزه. حالا متغیر f برابر این تابع شده و میشه عین یه تابع معمولی صداش زد.
این تابعی که به عنوان خروجی از fib اومد بیرون و الآن در f قرار گرفته، خودش هم یه عبارت return داره که
حاصل هر مرحله از دنبالهی فیبوناچی رو محاسبه میکنه. اما برای اینکه این مقدار از این تابع بینام return بشه،
باید این تابع رو صدا زد. برای همین هست که متغیر f رو ۵ بار عین یک تابع معمولی صدا زده و در هر بار صدا زدن هم
یکی از اعداد دنبالهی فیبوناچی برگشت داده میشه. شما اگه آخرین تابع رو از داخل Println پاک کنی میبینی که توی خروجی
هم یک عدد کم شده.
در واقع تابع fib فیبوناچی رو محاسبه نمیکنه. این تابع، تابعی رو برگشت میده که میتونه عمل محاسبهی فیبوناچی رو به شکل
مرحله ایی انجام بده. دقت کن که با اینکه تابع fib صدا زده میشه و کارش رو هم تموم میکنه، اما متغیرهای a و b از بین
نرفتن! چون هنوز به وجود اونها در تابع بینام نیاز هست. به این صورت هست که میگیم f تبدیل به یک closure شده (صفحه ۴۷
از کتابچه).
این در واقع مثالی بود که چاشنی های برنامهنویسی فانکشنال در Go رو نشون میداد. برای کار با این قابلیت ها باید با شیوه
ی برنامه نویسی فانکشنال آشنا باشی. برنامه نویسی فانکشنال روش خیلی قدرتمندی هست. ارزش مطالعه رو داره.