الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

السلاسل العودية (البحث عن أفضل حل)

بدأه KeepForward في 16 نوفمبر 2013 · 1 رد · 1,192 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كثيرا ما تمر معنا السلاسل العودية في البرمجة والتي تكون من الشكل التالي

C0 F(n) + C1 F(n-1) + ...... + Ck F(n-k) = 0

ولعل أشهر سلسلة عودية التي يعرفها معظمنا هي متسلسلة فيبوناتشي F(n) = F(n-1) + F(n-2) والتي تشتهر بتطبيقاتها العديدة في الرياضيات .
كثير من المبرمجين يقومون باستخدام العودية بشكل مباشر في البرمجة لإيجاد الناتج من أجل الحد n وهذه الخوارزمية من أبطأ الخوارزميات في إيجاد التوابع العودية .
وإذا ما بحثنا في كتب الرياضيات عن حلول مباشرة للمعادلة العودية سنجد حلولا رياضية تتعلق بشكل مباشر بالحد n والتي تكون على الأغلب من الشكل :

F(n) = A1R1^n + A2 R2^n  + ....... + Ak R^n

هذه الحلول هي حلول مباشرة ، ولكنها غير عمليه بتاتا فهي فاشلة إذا كانت n كبيرة جدا ولأن الحدود Ai و Ri غالبا ما تكون أعداد كسرية وهذا ما يؤدي بدوره إلى كثير من الضياعات عند تخزين الأعداد والعمليات الرياضية عليها.
 

الحل من أجل سلسلة فيبوناتشي :

2ds4rpf.jpg

 

 

 

 

 

 

 

إن أفضل خوارزمية متبعة في هذ المجال هي خوارزمية الحل عن طريق المصفوفات ، حيت يمكننا كتابة السلسلة العودية بالشكل المصفوفي  Xi+1 = M Xi . حيث M هي مصفوفة الأمثال .... يصبح علينا الآن فقط إيجاد المصفوفة M

epov0p.jpg

 

 

المصفوفة على الطرف اليساري من المعادلة هي مصفوفة Xi+1 أما المصفوفة اليمينية فهي مصفوفة Xi  وتكونا من الحجم K * 1. أما مصفوفة الأمثال M فهي من الحجم K*K
 

 

لنأخد سلسلة فيبوناتشي مثالا : F(n) = F(n-1) + F(n-2)

| f(n) |  = M x | f(n-1)   || f(n-1) |        | f(n-2) |

نعلم أن المصفوفة M من الحجم 2*2
 

| f(n) | = | a b | x | f(n-1)  |
| f(n-1) |   | c d |   | f(n-2)|

حيث F(n) = a*F(n-1) + b*F(n-2)       و    F(n-1) = c*F(n-1) +d*F(n-2) 
 

وبالتالي نجد أن :

| f(n) | = | 1 1 | x | f(n-1)  |
| f(n-1) |   | 1 0 |   | f(n-2)|

عند تعويض n = 2 في المعادلة السابقة نحصل على الشكل التالي :
 

| f(2) | = | 1 1 | x | 1 || f(1) |   | 1 0 |   | 0 |

لك ماذا لو أردنا الحل من أجل n=k مثلا ، عندها نقول

X2 = M X1

 

نضرب الطرفين ب M

M * X2 = M * M X1
X3 = M^2 X1

..

..
Xk+1 = M^k X1

 

M^2 = {{2,1} , {1,0}} => F(3) = 2

 

 

 

 

حسنا ماذا لو كانت المتسلسلة على الشكل التالي : f(n) = a*f(n-1) + b*f(n-2) + c*f(n-3) عندها :

| f(n+1) | = | a b c | x |   f(n) |
| f(n)   |   | 1 0 0 |   | f(n-1) |
| f(n-1) |   | 0 1 0 |   | f(n-2) |

ماذا لو كانت تتعلق بثابت : f(n) = a*f(n-1) + b*f(n-2) + c عندها نضيف الثابت إلى طرفي المعادلة العودية وذلك لتعلق جميع الحدود بنفس الثابت

| f(n+1) | = | a b 1 | x |   f(n) |
| f(n)   |   | 1 0 0 |   | f(n-1) |
| c    |   | 0 0 1 |   |     c    |

ماذا لو كانت تتعلق بمتسلسلة أخرى g(n) = a*g(n-1) + b*g(n-2) + c*f(n) حيث f(n) = d*f(n-1) + e*f(n-2) عندها

| g(n+1) |   | a b c 0 |   |   g(n) |
| g(n)   | = | 1 0 0 0 | x | g(n-1) |
| f(n+2) |   | 0 0 d e |   | f(n+1) |
| f(n+1) |   | 0 0 1 0 |   |   f(n) |

يفضل استعمال خوارزمية التقسيم والجمع لإيجاد M^k

أرجو أن تكونوا قد استفدتم من هذه المعلومات والسلام عليكم ورحمة الله وبركاته

2
#2

مادة علمية دسمة .. وموضوع هام .. أتمنى أن تتابع الشروحات من هذا المستوى ..

وكتعبير عن شكري قمت بإعادة كتابة المقالة في ملف Word لتنسيق المعادلات والمصفوفات .. تجدونه في المرفقات

 

والله ولي التوفيق

Recursive.rar

1

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…