- لو شغال في مجال البرمجة فهيعدي عليك مفهوم ال Recursion وفي الغالب هتسأل نفسك انا ليه بستخدمة وهيكون من الصعب عليك فهمة ودا طبيعي جدا لان محتاج تفهم ايه اللي بيحصل وراء الكواليس فكمل معايا وبإذن الله اوضحلك الامور بشكل بسيط.
_____________________
- قبل ما نبدأ في مفهوم ال Recursion تعال الاول نشوف ايه اللي بيحصل لما بتنادي Function وهي انها بتبدأ تنضاف ل Call Stack و ال Call Stack ممكن نعتبره زي السلم وان كل مرة بنادي Function بضفها في الدرجة اللي انا واقف عليها ولما ال Function تتنفذ ببدأ اشلها من الدرجة اللي ضفتها فيها.
- ولو دلوقت عندي Function اسمها one و Function تانية اسمها two وفي البرنامج بتاعي فأنا بعرف one وجواها بنادي two
function one() { two(); }
- فلما اجي انادي one فبتبدأ one تنضاف في اول درجة
- one (current)
- بس جواها بنادي two وبالتالي two بتنضاف للدرجة اللي بعدها
- one -- two (current)
- ولما two تتنفذ ببدأ اشلها من الدرجة اللي فيها وبرجع تاني للدرجة اللي موجود فيها one
- one -- two - one (current)
- ولما one تتنفذ ببدأ برضه اشيلها من ال Call Stack.
- one -- two - one_____________________
- نيجي بقي لمفهوم ال Recursion واني اخلي ال Function تنادي نفسها وزي ما اتفقنا فكل مرة بنادي فيها ال Function بتنضاف عندي في ال Call Stack وببدأ اشيلها لما بتتنفذ , بس كدا ال Call Stack بتاعي هيتملي لاني بفضل انادي نفس ال Function كل مرة وبالتالي هيظهر ليك خطأ "call stack size exceeded" فلازم تيجي عند شرط معين وتبدأ ترجع قيمة معينة بحيث ال Call Stack يبدأ يرجع بالقيمة دي ويديها للدرجة اللي قبله وهكذا لحد ما يرجع Call Stack فاضي تاني .
- طب ايه الغرض من اني اعمل حاجة زي كدا ؟ الغرض من كدا اني اجزء مشكلتي لمشاكل صغيرة وابدأ احل المشاكل الصغيرة وارجع بالنتيجة للدرجات اللي قبله دا غير ان الكود بتاعك بيكون سهل القراءة وتفهمة بشكل احسن ودا الوقت اننا نشوف مثال عملي ونبدأ نشوف ازاي فعلا الكود بيتنفذ.
_____________________
- مطلوب مني اني اعمل برنامج بياخد مني رقم ويبدأ يحسبلي ال Factorial ودا عبارة عن اني بضرب الرقم في الاصغر منه لحد ما يوصل ل 1 بمعني لو عندي رقم 5 وعاوز احسب ال Factorial فهحسبة عن طريق 5 * 4 * 3 * 2 * 1 والنتيجة هتكون 120, فمحتاج منك دلوقت تفكر لمدة 5 دقائق بأننا ازاي هنحل المشكلة دي بإستخدام ال Recursion ومش عاوزك خالص تكتب كود محتاج منك تكتب في خطوات ايه اللي المفروض اعملة واستخدم رسمة بسيطة توضح ليك اللي بيحصل فعلا في ال Call Stack ولو وصلت لحل او موصلتش فإنت فكلا الحالات مرنت عقلك لمدة 5 دقائق وهو دا المطلوب يصديقي.
- فإحنا دلوقت محتاجين نضرب الرقم في الاصغر منه لحد ما اوصل ل 1 فتعالي نطبق مفهوم ال Recursion , هعمل Function وهتاخد مني الرقم والمفروض اني هضرب الرقم في الاصغر منه وطبعا تقدر تعمل ال Function بأي لغة انت شغال بيها وهنا هستخدم Java Script.
function factorial(n) { return n * factorial(n-1); }
- فالمفروض لما ابدأ انادي الfactorial واديلها رقم 5 فهي هتنضاف عندي لل Call Stack وهترجعلي الرقم مضروب في اللي راجع من factorial لنفس الرقم وانقص منه واحد فكل مره هبدأ انادي factorial هينضاف عندي في درجة جديدة في ال call stack بس خلي بالك احنا كدا محطناش شرط يوقف لينا ال Recursion فلازم علشان اوقفة ان في حالة تحقيق شرط معين وهو لما الرقم يكون عباره عن 1 هرجع قيمة معينة وهي 1 ومش هنادي الfunction تاني.
function factorial(n) { if (n == 1) { return 1; } return n * factorial(n-1); }- فلما انادي ال factorial دا اللي هيحصل بالظبط في ال Call Stack وزي ما اتفقنا ان ال function مش هتتشال من ال Call Stack غير لما تتفنذ وترجعلي بقيمة ففي اول سطر factorial(5) بترجع 5 * factorial(4) ف factorial(5) مش هتتشال من ال Call Stack لحد ما factorial(4) ترجعلي بقيمة وهكذا.
- factorial(5) => 5 * factorial(4) -- factorial(4) => 4 * factorial(3) --- factorial(3) => 3 * factorial(2) --- factorial(2) => 2 * factorial(1) ---- factorial(1) => 1 --- factorial(2) => 2 * 1 --- factorial(3) => 3 * 2 -- factorial(4) => 4 * 6 - factorial(5) => 5 * 24
_____________________