طباعة الأرقام من n إلى 1 باستخدام recursion

basmala qur an allah madhhab mosaic بسم الله الرحمن الرحيم a462a02761ac8f0dbeb078e54568370a

المطلوب هو طباعة الأرقام من n إلى 1 باستخدام ال recursion.

طبعاً يمكن اتمام هذا المطلوب باستخدام for loop عادية ولكن هنا سنحاول اتمام هذا المطلوب باستخدام ال recursion وذلك لفهمه بصورة أكثر وضوحاً .

ولكن لماذا في مسئلة كهذه أفكر في recursion.

هذا هو أهم سؤال يجب أن تسأله نفسك (لماذا أفكر أصلاً في ال recursion) . ببساطة إذا تأملت في المسئلة فإنها عبارة عن مسئلة لطباعة الأرقام من n إلى 1 ولكن يمكنني أيضاً أن اقول لك أن المسئلة عبارة عن طباعة رقم واحد وهو n ثم إعادة تنفيذ نفس الأمر (وهو أمر الطباعة) مرة أخرى لرقم n – 1 و ثم n – 2 ثم ….. حتى 1 وهنا نستطيع القول المسئلة عبارة عن نفس العملية ولكن يتم تكرارها ب inputs مختلفة. وفي هذه الحالة والحالات المشابهة لها يجب علينا أن نفكر في ال recursion .

كيف ؟

نقوم بعمل دالة سنشير لها هنا ب fn هذه الدالة تطبع n وبعد طباعة n تقوم بعمل استدعاء لدالة أخرى هذه الدالة الأخرى مهمتها هي طباعة n – 1 .

والدالة التي قمنا باستدعائها ستقوم بطباعة الرقم n – 1 ثم ستقوم بطباعة الرقم n – 1 ثم ستقوم باستدعاء دالة لطباعة الرقم n – 2

وهكذا حتى نصل إلى الدالة التي ستقوم بطباعة الرقم 1.

الكود :

function printFromNTo1Recursive(n: number) {
    console.log(n);
}

هنا الدالة ستقوم بطباعة الرقم n ثم نريد منها استدعاء دالة أخرى لتقوم بطباعة n – 1 ولكن الدالة خاصتنا تقوم بطباعة الرقم المعطى لها فلم لا نقوم باستعدائها من داخل نفسها لتقوم بطباعة n – 1.

function printFromNTo1Recursive(n: number) {
    console.log(n);
    printFromNTo1Recursive(n - 1);
}

هنا عندما نقوم باستدعاء الدالة لتطبع n – 1 لاحظ أنها ستقوم باستدعاء نفسها ولكن n هذه المرة قيمتها أصغر من n الأولى بمقدار 1 فمثلاً إذا قلنا أن الرقم الأول كان 5 فإن قيمة n حالياً هي 4 ، وماذا ستقوم الدالة بعمله الآن ستقوم أولاً بطباعة ال 4 ثم ستقوم باستدعاء دالة أخرى وتعطيها n – 1 أي 3 فتقوم الدالة بطباعة ال 3 وتقوم باستدعاء وتعطيها n – 1 أى 2 وهكذا …..

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

فما الحل ؟

الحل هو في معظم الدوال ال recursive يكون هناك في أولها شرط لإنهائها يعمل عمل زر التدمير الذاتي فهو يقوم بإيقاف الاستدعائات عند حد معين وهذا الحد لدينا هو عندما نصل إلى رقم أقل من 1 حيث أننا نريد أن نطبع الرقم 1 إذا يمكننا التحقق ببساطة إذا كانت n أقل من 1 فأوقف الدالة.

function printFromNTo1Recursive(n: number) {
    if (n < 1) return;
    console.log(n);
    printFromNTo1Recursive(n - 1)
}

ملحوظة

كل استدعائات الدوال هذه تكون محفوظة في ال stack memory لأن الدالة الاولى لم تصل إلى نهايتها حتى انتهاء التي يليها وهكذا فلا يتم حذفها من الذاكرة حتى تنتهي الدالة التي قبلها.

picmix.com 3618251

اترك ردّاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *