سؤال

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

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

أنا قادر على تعيين الوظيفة الأولى لعناصر القائمة، ومع ذلك، فقد ضللت كثيرًا بعد ذلك.أيضًا، نظرًا لأن هذا تمهيدي، فأنا مقتصر على الوظائف التمهيدية (const, append, car, cdr, member, ، إلخ.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
هل كانت مفيدة؟

المحلول

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

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

...مع هذا الشخص:

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

إذا كنت لا تستطيع استخدام compose, ثم استبدل نفس السطر بهذا السطر:

((cadr f) ((car f) (car l)))               ; now we're applying both functions

الآن، إذا كانت المشكلة أكثر عمومية وكان مطلوبًا منك تعيين قائمة من الوظائف باستخدام أكثر من اثنين العناصر، ثم استبدل السطر نفسه في الكود الخاص بك مرة أخرى بما يلي:

((compose-multi f) (car l))

وتنفيذ وظيفة مساعدة تقوم بتكوين وإرجاع كافة الوظائف في القائمة، عن طريق الاستدعاءات المتتالية إلى compose.تم ترك هذا كتمرين لك، نظرًا لأنه واجب منزلي - ولكن إذا فهمت كيفية عمل الكود أعلاه لوظيفتين فقط، فيجب أن يكون من السهل توسيع النتيجة لقائمة من الوظائف المتعددة:

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

لاحظ أن وظيفة الهوية مطلوبة للتعامل مع الحالة التي لا توجد فيها عناصر في قائمة الوظائف؛من السهل جدًا تحديده، فهو يُرجع فقط نفس القيمة التي تم تمريرها كمعلمة.

كن على علم بذلك أيضًا compose-multi يعود أ وظيفة, ، نتيجة تكوين جميع الوظائف في القائمة - compose يفعل هذا لك، ولكن إذا لم يكن مسموحًا لك باستخدامه، فتذكر فقط أن هذا:

(compose x y)

...يعادل هذا:

(lambda (n) (x (y n)))

نصائح أخرى

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

ستقوم الوظيفة الأخرى ببساطة بتعيين هذه الوظيفة المساعدة عبر قائمة المدخلات.

إليك طريقة بديلة للتعريف multi-map والذي يستخدم بدلاً من التكوين العملية المسماة fold.نظرًا لأنه مسموح لك فقط باستخدام الوظائف التمهيدية، فهذا ليس هو الحل الحقيقي لمهمتك.ولكن سيكون الأمر كذلك، إذا كتبت تعريفك الخاص لـ fold (ليس طويلاً جداً!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)

للحصول على الدفء، ابدأ بمشكلة أبسط.ثم تعميم الحل.

كيف تكتب هذه الوظيفة؟

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

وهذا يتطلب قائمة، fs, ، لقيم الدالة كوسيطة ورقم، x, ، وحساب قيمة تطبيق (تكوين) الوظائف في fs ل x?

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