सार सूची कार्यों का उपयोग कर एक सूची का पॉवर्स

Nov 24 2020

क्या किसी दिए गए सूची के अधिकार को वापस करने के लिए एक रैकेट कार्य करना संभव है ?


अड़चनें-

  1. स्पष्ट पुनरावृत्ति के बिना
  2. सार सूची कार्यों का उपयोग करें
  3. कोड 2 लाइनों में निहित है (वास्तविक आवश्यकता)

उदाहरण के लिए: (powerset '(1 2))

'((1 2) (1) (2) ())

किसी भी क्रम में।

अन्य प्रश्न जो मुझे मिला वह अभी भी स्पष्ट पुनरावृत्ति का उपयोग करता है।


मेरा वर्कफ़्लो:

  1. (powerset '(a b c))एक उदाहरण के रूप में लेते हुए ,
  2. पहले पूरे नंबरों की एक सूची प्राप्त करें (expt 2 (length list)) ;'(0 1 2 3 4 5 6 7)
  3. उन्हें अपने संबंधित बाइनरी फॉर्म में परिवर्तित करें 2->(0,1,0)। तो हम प्राप्त करते हैं'((0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1))
  4. नक्शा (1 2 3) बायनेरिज़ की सूची में। उदाहरण के लिए:2->'(0,1,0)->'((0,a) (1,b) (0,c))
  5. परिणामी सूची को एक लंबोदर के साथ फ़िल्टर करें जैसे कि हम तत्वों को 1 के साथ रखते हैं, जैसे '((1,b))
  6. शक्तियां निकालें

मेरे दृष्टिकोण के साथ समस्या

यह 1 पंक्ति (फंक्शन हेडर के अतिरिक्त) में होने वाले प्रश्न की बाधा का पालन नहीं करता है।

(define (powerset list)
  ( ... )) ;; ie the code is contained in 2 lines of 80 characters

मेरे पास मेरे काम में यह सवाल एक बोनस सवाल था लेकिन मैं ऐसा नहीं कर पाया।

  1. अमूर्त सूची कार्य क्या हैं?
  • जैसे कार्य foldl, foldrऔरmap
  1. मेरे बोनस में 3 उपप्रकार शामिल थे
  • भाग 1 को इस फ़ंक्शन को किसी भी तरह से बनाने के लिए कहा गया था जो मैं चाहता था। इसलिए मैंने ऐसा करने के लिए पुनरावृत्ति का इस्तेमाल किया
  • भाग 2 वह हिस्सा है जिसके बारे में मैंने सवाल पूछा था। यह विशेष रूप से कठिन था क्योंकि कोड की एक अतिरिक्त बाधा 2 लाइनों के भीतर थी
  • भाग 3 सबसे कठिन माना जाता था।

किसी भी सहायक कार्य को न लिखें, और किसी भी स्पष्ट पुनरावृत्ति का उपयोग न करें (यानी, आपका फ़ंक्शन नाम से खुद को कॉल नहीं कर सकता है)। किसी भी सार सूची कार्यों का उपयोग न करें। वास्तव में, रैकेट काम करता है, स्थिरांक और विशेष रूपों के केवल निम्न सूची का उपयोग करें: cons, first, rest, empty?, empty, lambda, और cond

हालांकि, मजेदार बात, मैंने अध्ययन किया Y-combinatorऔर इस एक को हल करने में सक्षम था (कोडिंग के 6 बजे के बाद)।

जवाब

2 WillNess Nov 25 2020 at 16:57

अपने बोनस भाग 2 का उत्तर देने के लिए:

(define (pws l) 
  (foldr (lambda (e a) (append (map (lambda (x) (cons e x)) a) a)) '(()) l))

दो लाइनें, 80 से कम चार्ट प्रत्येक, पहली पंक्ति के लिए आरक्षित define(इसलिए, एक पंक्ति)।

यदि appendअनुमति नहीं है, तो हम append ... mapसंयोजन को भी एक में बदल देते हैं foldr:

(define (pws-fr l) 
  (foldr (lambda (e a)
           (foldr (lambda (x r)
                    (cons (cons e x) r))
                  a a))
         '(()) l))

या, छोटा,

(define (pws-fr-1 l) 
  (foldr (lambda (e a) (foldr (lambda (x r) (cons (cons e x) r)) a a)) '(()) l))

(इसकी दूसरी पंक्ति में ठीक 80 वर्णों के साथ)।

इस कोड को कोड करने का एक और तरीका है append-map-बेड कोड (दूसरा स्निपेट) इस उत्तर से, जब foldrकेवल के साथ फिर से कोडित किया जाता है,

(define (pws-am-fr l) 
  (foldr (lambda (e a)
           (foldr (lambda (x r)
                    (cons x (cons (cons e x) r)))
                  '() a))
         '(()) l))

या छोटा,

(define (pws-am-fr1 l) (foldr (lambda (e a)
   (foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))

जो आपकी आवश्यकताओं की पूर्ति कर सकता है या नहीं।