سؤال

في هيكل وتفسير برامج الكمبيوتر (SICP) القسم 2.2.3 يتم تعريف العديد من الوظائف باستخدام:

(accumulate cons nil 
  (filter pred
         (map op sequence)))

مثالان يستفيدان من هذا على قائمة أرقام فيبوناتشي ، even-fibs و list-fib-squares.

يتم تعريف وظائف التراكم والتصفية والخريطة في القسم 2.2 أيضًا. الجزء الذي يربكني هو السبب في أن المؤلفين شملوا accumulate هنا. accumulate يأخذ 3 معلمات:

  • وظيفة ثنائية يتم تطبيقها

  • القيمة الأولية ، تستخدم كمعلمة أقصى اليمين للوظيفة

  • قائمة سيتم تطبيق الوظيفة إليها

مثال على تطبيق التراكم على قائمة باستخدام التعريف في الكتاب:

    (accumulate cons nil (list 1 2 3))
    => (cons 1 (cons 2 (cons 3 nil)))
    => (1 2 3)

لأن المعلمة الثالثة هي قائمة ، (accumulate cons nil some-list) سيعود فقط some-list, وفي هذه الحالة نتيجة (filter pred (map op sequence)) هي قائمة.

هل هناك سبب لهذا الاستخدام accumulate بخلاف الاتساق مع وظائف أخرى منظمة بالمثل في القسم؟

هل كانت مفيدة؟

المحلول

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

(جانبا: لاحظ أنه من الواضح أن هذا يمكن أن يكون عملية أكثر فائدة إذا كان إخراج filter ومدخلات accumulate لم تكن قائمة على سبيل المثال ، إذا كان يمثل تسلسلًا تم إنشاؤه بتكاسل.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top