اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

بالنسبة للتكرار أو Recursion هو عملية استدعاء الدالة لنفسها، و كل مرة يتم استدعاء الدالة من داخل نفسها، يتم تخصيص مساحة إضافية في الـ Stack لتخزين معلومات حول هذه الاستدعاءات، مثل المعاملات الحالية ونقطة العودة، وهذا الأمر يستهلك ذاكرة أكثر عادة، لأنه يحتاج إلى تخصيص ذاكرة جديدة في الـ Stack لكل استدعاء للدالة، وبالتالي يجعل التكرار غير ملائم في بعض الحالات التي تتطلب عمق استدعاء كبير، وقد يؤدي إلى Stack Overflow إذا تجاوز عدد الاستدعاءات الحد الأقصى المسموح به.

أما الحلقات تستهلك ذاكرة أقل لأنها لا تحتاج إلى إضافة سياقات استدعاء جديدة كما يحدث في التكرار، و يمكن أن تعمل بشكل مستمر دون خوف من تجاوز ذاكرة الـ Stack، لذا من حيث استهلاك الذاكرة، الحلقات أفضل بكثير من التكرار، ولكن لكل منهما استخداماته وميزاته الخاصة حسب طبيعة المشكلة.

  • 0
نشر

بالطبع تستهلك الـ Recursion كمية أكبر من الذاكرة مقارنة بالـ Loop، لأن كل استدعاء متكرر للدالة يُنشئ إطارًا جديدًا على المكدس stack.

وذلك يؤدي ذلك إلى مشكلة Stack Overflow في حال كان عدد الاستدعاءات كبيرًا جدًا.

والمكدس هو منطقة من الذاكرة تُستخدم لتخزين البيانات بطريقة LIFO (Last In First Out)، وتُدار تلك المنطقة من الذاكرة بواسطة وحدة المعالجة المركزية CPU بشكل تلقائي.

والـ Recursion أبطأ من الـ Loop في بعض الحالات، خاصةً مع عدد الاستدعاءات الكبيرًا لأن تكلفة إنشاء إطارات المكدس وإدارتها تكون عالية.

بالتالي الـ Recursion نستخدمه في حل المشكلات التي يمكن تقسيمها إلى مشكلات أصغر من نفس النوع مثل الـ Tree Traversal والـ Merge Sort.

بينما الـ Loop حل المشكلات التي تتطلب تكرار مجموعة من التعليمات لعدد محدد من المرات أو حتى يتم استيفاء شرط معين مثل التكرار على قائمة والتحقق من شرط معين.

 

  • 0
نشر
بتاريخ 10 دقائق مضت قال Chihab Hedidi:

بالنسبة للتكرار أو Recursion هو عملية استدعاء الدالة لنفسها، و كل مرة يتم استدعاء الدالة من داخل نفسها، يتم تخصيص مساحة إضافية في الـ Stack لتخزين معلومات حول هذه الاستدعاءات، مثل المعاملات الحالية ونقطة العودة، وهذا الأمر يستهلك ذاكرة أكثر عادة، لأنه يحتاج إلى تخصيص ذاكرة جديدة في الـ Stack لكل استدعاء للدالة، وبالتالي يجعل التكرار غير ملائم في بعض الحالات التي تتطلب عمق استدعاء كبير، وقد يؤدي إلى Stack Overflow إذا تجاوز عدد الاستدعاءات الحد الأقصى المسموح به.

أما الحلقات تستهلك ذاكرة أقل لأنها لا تحتاج إلى إضافة سياقات استدعاء جديدة كما يحدث في التكرار، و يمكن أن تعمل بشكل مستمر دون خوف من تجاوز ذاكرة الـ Stack، لذا من حيث استهلاك الذاكرة، الحلقات أفضل بكثير من التكرار، ولكن لكل منهما استخداماته وميزاته الخاصة حسب طبيعة المشكلة.

اه يعني مش كل حاجه Recursion هو ليه حالات معينه ولكن هو مفيد جدا سواء في الخوزرميه او الرياضيات المقطعيه 

بتاريخ 7 دقائق مضت قال Mustafa Suleiman:

مشكلة Stack Overflow

بس المشكله دي ممكن تحصل مع لغات عالي المستوي زي بايثون والا بس مع لغه سي او سي++

  • 0
نشر
بتاريخ 3 دقائق مضت قال Ail Ahmed:

اه يعني مش كل حاجه Recursion هو ليه حالات معينه ولكن هو مفيد جدا سواء في الخوزرميه او الرياضيات المقطعيه 

بس المشكله دي ممكن تحصل مع لغات عالي المستوي زي بايثون والا بس مع لغه سي او سي++

بالضبط التكرار فعلا له حالات معينة يكون فيها أكثر فعالية أو سهولة في التعبير عن الحل، وخاصة في مسائل الخوارزميات والرياضيات المقطعية، ولكن ليس كل شيء يمكن حله بكفاءة باستخدام التكرار، خاصة في المسائل التي تتطلب عمق استدعاء كبير، لذا يفضل التفكير في التوازن بين الأداء وسهولة الفهم عند اختيار التكرار أو الحلقات.

بتاريخ 7 دقائق مضت قال Ail Ahmed:
بتاريخ 14 دقائق مضت قال Mustafa Suleiman:

مشكلة Stack Overflow

أما مشكلة Stack Overflow يمكن أن تحدث في جميع اللغات، سواء كانت لغات عالية المستوى مثل بايثون أو لغات منخفضة المستوى مثل C وC++، لأنها تتعلق بالذاكرة المتاحة في الـ Stack، وهي جزء من ذاكرة النظام المخصص لاستدعاءات الدوال، سواء في بايثون أو في C/C++ أو أي لغة تدعم التكرار العميق.

  • 0
نشر

الفرق الرئيسي بين recursion وloop يكمن في كيفية تنفيذ التكرار فالحلقات تستخدم بنية تحكم لتكرار كتلة من التعليمات البرمجية بشكل مباشر، بينما recursion يحقق التكرار عن طريق استدعاء الدالة نفسها من داخلها. هذا يؤدي إلى اختلافات مهمة في الأداء واستهلاك الذاكرة.

الحلقات يمكن اعتبارها مناسبة للمهام التكرارية البسيطة حيث يكون الأداء هو الاعتبار الرئيسي أما  recursion  فهو مناسب للمشاكل التي يمكن تقسيمها إلى نسخ أصغر من نفسها مثل عمليات البحث في الأشجار مثلا 

لكن الاعتماد على أيّ منها يعتمد على طبيعة المشكلة والمتطلبات الخاصة بالمشروع ففي كثير من الأحيان يمكن تحويل recursion إلى حلقات والعكس صحيح، ولكن يجب مراعاة تأثير ذلك على الأداء واستهلاك الذاكرة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...