الخميس، 29 نوفمبر 2012

هيا نستخدم تعبيرات لامدا(1): الترتيب والمقارنة



 هب أن لدينا هذا الإجراء الذي يرتب مصفوفة من الأعداد (الإجراء بطيء لكنه بسيط بما يكفي للأهداف التعليمية):


إجراء رتب (م):
    لكل أ من 1 إلى عدد (م):
        لكل ب من أ + 1 إلى عدد (م):
            إذا م [أ] > م [ب]:
                مؤقت = م [أ]
                م [أ]= م [ب]
                م [ب]= مؤقت 
            تم 
        تابع 
    تابع 
نهاية 

م = [5، 12، 8، 4، 3، 9]
رتب (م)
اطبع م

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

الإجراء يأخذ عاملاً parameter هو المصفوفة 'م'، ماذا لو كان يأخذ عاملاً آخر هو الدالة التي يستخدمها في سطر المقارنة؟
إجراء رتب (م، دالة.المقارنة):
    لكل أ من 1 إلى عدد (م):
        لكل ب من أ + 1 إلى عدد (م):
            إذا دالة.المقارنة : تنفيذها (م [أ]، م [ب]):
                مؤقت = م [أ]
                م [أ]= م [ب]
                م [ب]= مؤقت 
            تم 
        تابع 
    تابع 
نهاية 

م = [5، 12، 8، 4، 3، 9]
رتب (م، λ س، ص : س > ص)
اطبع م

لقد قمنا بثلاث تغييرات صغيرة:
  1. أضفنا عاملاً هو دالة.المقارنة
  2. بدلاً من الاختبار م[أ] > م[ب]، جعلناه دالة.المقارنة: تنفيذها(م[أ]، م[ب])
  3. عند استدعاء الإجراء رتب، أعطيناه دالة مقارنة هي λ س، ص : س > ص، أي الدالة التي لو أخذت س و ص تعود بالقيمة س>ص (القيمة 'صحيح' أو 'خطأ' حسب نتيجة المقارنة).
 هذا البرنامج سيتصرف بالضبط مثل البرنامج السابق، لكن يمكننا أن نغيره كما نشاء باستخدام العامل الجديد! مثلاً من أجل الترتيب التنازلي، نقدم دالة مقارنة بالعلامة معكوسة λ س، ص : س < ص  .
ماذا لو أردنا ترتيب مصفوفة من الأشخاص حسب السن مثلاً؟ (اعتبر لدينا فصيلة اسمها "شخص" بها بيان اسمه "سن"). وقتها يكفي أن نقول هذا:

رتب (الأشخاص، λ أ، ب : سن أ > سن ب)


ماذا لو أردنا ترتيب الأشخاص حسب السن تنازلياً؟ يكفي تغيير العلامة في تعبير لامدا.

ليست هناك تعليقات: