پایگاه دانش علوم کامپیوتر و مهندسی نرم‌افزار - sref.ir

مسئله‌های چالشی برنامه‌نویسی، داده‌ساختارها و الگوریتم‌ها

پل‌های ارتباطی

معرفی دنباله‌ی فیبوناچی

اعداد زیر را در نظر بگیرید:

..., -8, 5, -3, 2, -1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

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

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

دنباله‌ی بالا به افتخار لئوناردو فیبوناچی ریاضی‌دان ایتالیایی قرن سیزدهم به‌نام وی نامگذاری شده‌است چون اولین بار او بود که این اعداد را معرفی کرد. موضوعی که مطرح بود و لئوناردو را به کشف اعداد فیبوناچی رساند، مزرعه‌ی پرورش خرگوش بود!

او با خود فکر می‌کرد که اگر یک جفت خرگوش نر و ماده داشته باشد و شروع به زاد و ولد با یک الگوی مشخص کنند، پس از گذشت مدت زمان مشخصی (مثلا 20 ماه) در مجموع چند جفت خرگوش خواهد داشت؟ البته فرض‌ها و قواعدی هم برای این‌الگو در نظر گرفت:
    - خرگوش‌ها پس از یک ماه بالغ می‌شوند
    - دوران بارداری خرگوش‌ها یک ماه است
    - هنگامی که خرگوش ماده به سن بلوغ می‌رسد حتماً باردار می‌شود
    - در هر بار بارداری خرگوش ماده یک خرگوش نر و یک ماده به‌دنیا می‌آورد
    - خرگوش‌ها هرگز نمی‌میرند
در نهایت تعداد جفت‌ها در پایان ماه nاُم را با دنباله‌ی زیر نشان داد که همان دنباله‌ی فیبوناچی است.

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

بعدا جمله‌ی صفر را نیز به ابتدای این دنباله اضافه کرده‌اند اما من علاقه‌ای به این کار ندارم. هر چند همه‌ی محاسبات و الگوریتم‌های گفته شده در این وب سایت در مورد جمله‌ی صفر نیز صادق است. بیایید برای درک بهتر موضوع، به ازای هر جمله از این دنباله یک مربع ترسیم کنیم. طول ضلع مربع مربوط به هر جمله برابر مقدار همان جمله است. مانند شکل زیر:

حال مربع‌ها به قرار زیر می‌توانند در کنار هم قرار بگیرند:

اگر ربع دایره‌ای که شعاع آن به اندازه‌ی ضلع مربع است را در داخل هر مربع محاط کنیم، شکل جالب‌تری به‌وجود می‌آید:

ادامه دارد....

در درخت محاسبات بالا همانطور که می‌بینید برای محاسبه‌ی جمله‌ی ششم، محاسبه‌ی جملات پنجم و چهارم لازم است. اما برای محاسبه‌ی جمله‌ی پنجم، محاسبه‌ی جملات چهارم و سوم را نیاز داریم. ملاحظه می‌کنید که تا اینجای کار جمله‌ی چهارم دوبار محاسبه شده است. به همین ترتیب جمله‌ی سوم 3 بار محاسبه می‌شود. در کل برای بدست آورن جمله‌ی ششم (که مقدارش برابر 8 است) 7 عمل جمع انجام می‌دهیم درحالی‌که بر روی کاغذ می‌توان تنها با 4 عمل جمع آن را بدست آورد. هرچند در این مثال کوچک تعداد تکرارها کم است، اما با بزرگ شدن اندازه‌ی مسئله تعداد محاسبات تکراری خیلی زیاد می‌شود. می‌توان ثابت کرد تعداد محاسبات (عمل جمع) برای محاسبه‌ی بازگشتی جمله‌ی iاُم از رابطه‌ی زیر بدست می‌آید:

Si = Si-1 + Si-2 + 1

که در آن Si تعداد عملیات جمع برای محاسبه‌ی مقدار جمله‌ی iاُم است. می‌دانیم که مقدار S1 و S2 برابر صفر است چون برای محاسبه‌ی جمله‌ی اول و دوم نیازی به عملیات جمع نیست و مقدار این جملات بصورت صریح داده شده است. سایر مقادیر به این‌صورت محاسبه می‌شوند:

S1 = 0
S2 = 0
S3 = S2 + S1 + 1 = 0 + 0 + 1 = 1
S4 = S3 + S2 + 1 = 1 + 0 + 1 = 2
S5 = S4 + S3 + 1 = 2 + 1 + 1 = 4
S6 = S5 + S4 + 1 = 4 + 2 + 1 = 7

دنباله‌ی S که تعداد عملیات جمع برای محاسبه‌ی هر جمله از دنباله‌ی فیبوناچی را نشان می‌دهد، معادل خود دنباله فیبوناچی است:

F = 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
S = 0, 0, 1, 2, 4, 7, 12, 20, 33, ...

با توجه به جملات هر دو دنباله می‌توان رابطه‌ی زیر را نوشت:

Si = Fi - 1

یعنی برای محاسبه‌ی هر مقدار از دنباله‌ی فیبوناچی مانند f به f-1 عمل جمع نیاز داریم و این یعنی اتلاف قطعی زمان!
به‌عنوان مثال عدد 75025 که جمله‌ی بیست و پنجم دنباله‌ی فیبوناچی است، بر روی کاغذ با 23 عمل جمع قابل محاسبه است، اما با پیاده سازی بازگشتی به روش تقسیم و غلبه 75024 عمل جمع انجام می‌شود.

    تگ ها