الخوارزمية العودية: الوصف والتحليل والميزات والأمثلة

جدول المحتويات:

الخوارزمية العودية: الوصف والتحليل والميزات والأمثلة
الخوارزمية العودية: الوصف والتحليل والميزات والأمثلة
Anonim

الفهم الحديث للتكرار: تعريف الوظيفة والوصول إليها من الخارج ومن هذه الوظيفة. يعتقد أن علماء الرياضيات ولدوا العودية: حساب عاملي ، سلسلة لانهائية ، فركتلات ، كسور مستمرة … ومع ذلك ، يمكن العثور على العودية في كل مكان. القوانين الطبيعية الموضوعية "تعتبر" العودية الخوارزمية الرئيسية وشكل التعبير (الوجود) ليس كثيرًا من كائنات العالم المادي ، ولكن بشكل عام الخوارزمية الرئيسية للحركة.

الخوارزمية العودية
الخوارزمية العودية

يستخدم الأشخاص من مختلف التخصصات في مختلف مجالات العلوم والتكنولوجيا الخوارزمية العودية f (x) ، حيث "x ~ /=f (x)". الوظيفة التي تستدعي نفسها هي حل قوي ، لكن تكوين وفهم هذا الحل ، في معظم الحالات ، مهمة صعبة للغاية.

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

العودية ، الخوارزميات العودية: المعنى وبناء الجملة

يمكن حل المشكلة ، التي تمت صياغتها بتكرار سلسلة من العمليات ، بشكل متكرر. خوارزمية بسيطة (حساب معادلة من الدرجة الثانية ، نص برمجي لملء صفحة ويب بالمعلومات ، قراءة ملف ، إرسال رسالة …) لا تتطلب العودية.

الاختلافات الرئيسية في الخوارزمية التي تسمح بحل متكرر:

  • هناك خوارزمية يجب تنفيذها عدة مرات ؛
  • تحتاج الخوارزمية إلى بيانات تتغير في كل مرة ؛
  • لا يجب أن تتغير الخوارزمية في كل مرة ؛
  • هناك شرط نهائي: الخوارزمية متكررة - ليست لانهائية.

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

الخوارزمية متكررة: عندما يتم تنفيذ سلسلة من العمليات بشكل متكرر ، على البيانات التي تتغير في كل مرة وتعطي نتيجة جديدة في كل مرة.

صيغة العودية

الفهم الرياضي للتكرار والتماثلية في البرمجة مختلفان. الرياضيات ، على الرغم من وجود علامات على البرمجة ، إلا أن البرمجة هي رياضيات أعلى من ذلك بكثير.

خوارزمية متكررة و
خوارزمية متكررة و

الخوارزمية جيدة الكتابة مثل مرآة عقل مؤلفها. عامصيغة العودية في البرمجة هي "f (x)" ، حيث "x ~ /=f (x)" لها تفسيران على الأقل. هنا "~" هو التشابه أو عدم وجود النتيجة ، و "=" هو وجود نتيجة الدالة.

الخيار الأول: ديناميكيات البيانات.

  • وظيفة "f (x)" لها خوارزمية متكررة وغير قابلة للتغيير ؛
  • "x" والنتيجة "f (x)" لها قيم جديدة في كل مرة ، والنتيجة "f (x)" هي المعلمة "x" الجديدة لهذه الوظيفة.

الخيار الثاني: ديناميات الكود.

  • تحتوي الوظيفة "f (x)" على عدة خوارزميات تعمل على تنقيح (تحليل) البيانات ؛
  • تحليل البيانات - جزء واحد من الكود وتنفيذ الخوارزميات العودية التي تؤدي الإجراء المطلوب - الجزء الثاني من الكود ؛
  • نتيجة الدالة "f (x)" ليست كذلك.

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

البيانات والعودية

البرمجة الخوارزمية العودية لا تتعلق بحساب عاملي ، حيث تتلقى الوظيفة في كل مرة قيمة معينة تزيد أو تقل عن واحد - يعتمد خيار التنفيذ على تفضيل المطور.

لا يهم كيف العامل "8!" ،الخوارزمية التي تتبع بدقة هذه الصيغة.

معالجة المعلومات هي "رياضيات" بترتيب مختلف تمامًا. تعمل الدوال والخوارزميات التكرارية هنا على الحروف والكلمات والعبارات والجمل والفقرات. يستخدم كل مستوى تالي المستوى السابق.

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

التجريد والعودية و OOP

البرمجة الشيئية (OOP) والتكرار هما كيانان مختلفان تمامًا ، لكنهما يكملان بعضهما البعض تمامًا. لا علاقة للتجريد بالتكرار ، ولكن من خلال عدسة OOP ، فإنه يخلق إمكانية تنفيذ العودية السياقية.

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

البرمجة الخوارزميات العودية
البرمجة الخوارزميات العودية

وفي الوقت نفسه ، إذا كان مستوى الأحرف "لا جدوى من البحث عن المعنى" ، فستظهر الدلالات على مستوى الكلمات. يمكنك تقسيم الكلمات إلى أفعال ، وأسماء ، وظروف ، وحروف جر … يمكنك الذهاب أبعد من ذلك وتحديد الحالات.

على مستوى العبارة ، تُستكمل الدلالات بعلامات الترقيم والمنطقكلمة تركيبات. على مستوى الجمل ، تم العثور على مستوى أفضل من دلالات الكلمات ، ويمكن اعتبار الفقرة كفكرة كاملة.

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

من المهم أن الجزء الساحق من الخوارزمية يمكن صياغته على مستوى السلف المجرد ، وتنقيحه على مستوى كل سليل بالبيانات والطرق التي يتم استدعاؤها من المستوى المجرد. في هذا السياق ، يفتح التجريد آفاقًا جديدة للتكرار.

الميزات التاريخية لـ OOP

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

المصطلحات "كائن" و "موضوعي" في السياق الحديث لـ OOP تُنسب عادةً إلى الخمسينيات والستينيات من القرن الماضي ، لكنها مرتبطة بعام 1965 وظهور Simula و Lisp و Algol و Smalltalk

في تلك الأيام ، لم يتم تطوير البرمجة بشكل خاص ولم تستطع الاستجابة بشكل كافٍ للمفاهيم الثورية. كان الصراع بين الأفكار وأنماط البرمجة (C / C ++ و Pascal - في الغالب) بعيدًا ، ولا تزال قواعد البيانات تتشكل من الناحية المفاهيمية.

خوارزميات العودية
خوارزميات العودية

في أواخر الثمانينيات وأوائل التسعينيات ، ظهرت الكائنات في باسكال وتذكر الجميع الفصول في C / C ++ - وهذا يمثل جولة جديدة من الاهتمام بـ OOP ، وبعد ذلك أصبحت الأدوات ، خاصة لغات البرمجة ، ليست كذلك دعم الأفكار الشيئية فقط ، لكن تتطور وفقًا لذلك.

بالطبع ، إذا كانت الخوارزميات العودية السابقة مجرد وظائف مستخدمة في الكود العام للبرنامج ، فيمكن الآن أن تصبح العودية جزءًا من خصائص كائن (فئة) ، مما يوفر فرصًا مثيرة للاهتمام في سياق الوراثة.

ميزة OOP الحديثة

تطوير OOP المعلنة في البداية الكائنات (الفئات) كمجموعات من البيانات والخصائص (الطرق). في الواقع ، كان الأمر يتعلق بالبيانات التي لها بناء الجملة والمعنى. ولكن بعد ذلك لم يكن من الممكن تقديم OOP كأداة لإدارة الأشياء الحقيقية.

الدوال والخوارزميات العودية
الدوال والخوارزميات العودية

أصبحOOP أداة لإدارة كائنات "طبيعة الكمبيوتر". يعد البرنامج النصي أو الزر أو عنصر القائمة أو شريط القوائم أو العلامة في نافذة المتصفح كائنًا. لكن ليس آلة أو منتجًا غذائيًا أو كلمة أو جملة. بقيت الأشياء الحقيقية خارج البرمجة الشيئية ، وأخذت أدوات الكمبيوتر تجسيدًا جديدًا.

بسبب الاختلافات في لغات البرمجة الشائعة ، ظهرت العديد من لهجات OOP. من حيث الدلالات ، فهي متكافئة عمليًا ، وتركيزها على المجال الآلي ، وليس على المجال التطبيقي ، يجعل من الممكن أخذ وصف الأشياء الحقيقية إلى ما هو أبعد من ذلك.الخوارزميات والتأكد من وجودها عبر الأنظمة الأساسية واللغات.

الأكوام وآليات استدعاء الوظيفة

تتطلب آليات استدعاء الوظائف (الإجراءات ، الخوارزميات) تمرير البيانات (المعلمات) ، وإرجاع النتيجة ، وتذكر عنوان المشغل الذي يجب أن يتلقى التحكم بعد اكتمال الوظيفة (الإجراء).

أمثلة الخوارزميات العودية
أمثلة الخوارزميات العودية

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

مفهوم الخوارزميات العودية ، عندما يمكن تحديد أسمائهم وأجسادهم في وقت تشكيل المهمة (اختيار الخوارزمية المرغوبة) ، يمتد التكرار ليس فقط لكيفية القيام بشيء ما ، ولكن أيضًا لمن يجب افعلها. يعد اختيار خوارزمية باسمها "ذي المعنى" واعدًا ، لكنه يخلق صعوبات.

التكرار على مجموعة من الوظائف

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

التطبيقات العملية لا تعطي دائمًا حلاً نظيفًا. في كثير من الأحيان ، يجب إعداد البيانات الأولية ، ويجب تحليل نتيجة المكالمة العودية في سياق المشكلة بأكملها (الخوارزمية بأكملها) فيبشكل عام.

في الواقع ، ليس فقط قبل استدعاء دالة تكرارية ، ولكن أيضًا بعد اكتمالها ، يمكن أو يجب استدعاء برنامج آخر. إذا لم تكن هناك مشاكل خاصة مع المكالمة: تستدعي الوظيفة العودية A () الوظيفة B () ، والتي تقوم بشيء ما وتستدعي A () ، فحينئذٍ توجد مشكلة على الفور في عودة عنصر التحكم. بعد إكمال المكالمة المتكررة ، يجب أن تتلقى الوظيفة A () التحكم من أجل إعادة استدعاء B () ، والتي ستستدعيها مرة أخرى. إعادة التحكم كما يجب أن يكون بالترتيب على المكدس إلى B () هو الحل الخطأ.

المبرمج غير مقيد في اختيار المعلمات ويمكنه إكمالها بأسماء الوظائف. بمعنى آخر ، الحل المثالي هو تمرير اسم B () إلى A () والسماح لـ A () نفسها باستدعاء B (). في هذه الحالة ، لن تكون هناك مشاكل مع إعادة التحكم ، وسيكون تنفيذ الخوارزمية العودية أكثر شفافية.

فهم ومستوى العودية

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

حل الخوارزميات العودية
حل الخوارزميات العودية

حاليًا ، لا توجد قيود على مستوى تداخل الوظائف وسعة المكدس في آليات الاستدعاء ، ولكن هناك مشكلة في الفهم: في أي نقطة زمنية أي مستوى بيانات أو أي مكان في الخوارزمية العامة يسمى العودية وظيفة وعلى أي عدد من المكالمات هي نفسها.

أدوات تصحيح الأخطاء الموجودة غالبًا ما تكون عاجزةأخبر المبرمج بالحل الصحيح

حلقات وتكرار

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

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

تنفيذ الخوارزميات العودية
تنفيذ الخوارزميات العودية

المعنى هنا هو أن الحل التكراري في شكل دالة باستخدام نفسها سيكون خوارزمية كاملة وظيفيًا. ستتطلب هذه الخوارزمية من المبرمج إنشائها بجهد وفهم ديناميكيات الخوارزمية ، لكنها ستكون الحل النهائي الذي لا يتطلب تحكمًا خارجيًا.

أي مجموعة من العوامل الخارجية الشرطية والدورية لن تسمح لنا بتمثيل الخوارزمية العودية كوظيفة كاملة.

إجماع العودية و OOP

في جميع المتغيرات تقريبًا لتطوير خوارزمية عودية ، تظهر خطة لتطوير خوارزميتين. تنشئ الخوارزمية الأولى قائمة بالكائنات المستقبلية (مثيلات) ، والخوارزمية الثانية هي في الواقع دالة تكرارية.

الحل الأفضل هو ترتيب العودية كخاصية واحدة (طريقة) تحتوي في الواقع على الخوارزمية العودية ، ووضع كل الأعمال التحضيرية في مُنشئ الكائن.

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

يجب أن تكون العودية دائمًا حلاً كاملاً قائمًا بذاته.

فهم حدسي واكتمال وظيفي

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

خاصية العودية: يمكن تطبيقها على كل شيء:

  • تجريف الويب ؛
  • عمليات بحث ؛
  • تحليل معلومات النص ؛
  • قراءة أو إنشاء مستندات MS Word ؛
  • أخذ عينات أو تحليل العلامات…

خاصية OOP: تجعل من الممكن وصف خوارزمية تكرارية على مستوى سلف مجرد ، ولكنها تنص على أنها تشير إلى أحفاد فريدة ، لكل منها لوحة خاصة بها من البيانات والخصائص.

مفهوم الخوارزميات العودية
مفهوم الخوارزميات العودية

العودية مثالية لأنها تتطلب الاكتمال الوظيفي للخوارزمية الخاصة بها. يعمل OOP على تحسين أداء الخوارزمية العودية من خلال منحها إمكانية الوصول لجميع الأطفال الفريدين.

موصى به: