सार सूची कार्यों का उपयोग कर एक सूची का पॉवर्स
क्या किसी दिए गए सूची के अधिकार को वापस करने के लिए एक रैकेट कार्य करना संभव है ?
अड़चनें-
- स्पष्ट पुनरावृत्ति के बिना
- सार सूची कार्यों का उपयोग करें
- कोड 2 लाइनों में निहित है (वास्तविक आवश्यकता)
उदाहरण के लिए: (powerset '(1 2))
'((1 2) (1) (2) ())
किसी भी क्रम में।
अन्य प्रश्न जो मुझे मिला वह अभी भी स्पष्ट पुनरावृत्ति का उपयोग करता है।
मेरा वर्कफ़्लो:
(powerset '(a b c))
एक उदाहरण के रूप में लेते हुए ,- पहले पूरे नंबरों की एक सूची प्राप्त करें
(expt 2 (length list)) ;'(0 1 2 3 4 5 6 7)
- उन्हें अपने संबंधित बाइनरी फॉर्म में परिवर्तित करें
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))
- नक्शा (1 2 3) बायनेरिज़ की सूची में। उदाहरण के लिए:
2->'(0,1,0)->'((0,a) (1,b) (0,c))
- परिणामी सूची को एक लंबोदर के साथ फ़िल्टर करें जैसे कि हम तत्वों को 1 के साथ रखते हैं, जैसे
'((1,b))
। - शक्तियां निकालें
मेरे दृष्टिकोण के साथ समस्या
यह 1 पंक्ति (फंक्शन हेडर के अतिरिक्त) में होने वाले प्रश्न की बाधा का पालन नहीं करता है।
(define (powerset list)
( ... )) ;; ie the code is contained in 2 lines of 80 characters
मेरे पास मेरे काम में यह सवाल एक बोनस सवाल था लेकिन मैं ऐसा नहीं कर पाया।
- अमूर्त सूची कार्य क्या हैं?
- जैसे कार्य
foldl
,foldr
औरmap
- मेरे बोनस में 3 उपप्रकार शामिल थे
- भाग 1 को इस फ़ंक्शन को किसी भी तरह से बनाने के लिए कहा गया था जो मैं चाहता था। इसलिए मैंने ऐसा करने के लिए पुनरावृत्ति का इस्तेमाल किया
- भाग 2 वह हिस्सा है जिसके बारे में मैंने सवाल पूछा था। यह विशेष रूप से कठिन था क्योंकि कोड की एक अतिरिक्त बाधा 2 लाइनों के भीतर थी
- भाग 3 सबसे कठिन माना जाता था।
किसी भी सहायक कार्य को न लिखें, और किसी भी स्पष्ट पुनरावृत्ति का उपयोग न करें (यानी, आपका फ़ंक्शन नाम से खुद को कॉल नहीं कर सकता है)। किसी भी सार सूची कार्यों का उपयोग न करें। वास्तव में, रैकेट काम करता है, स्थिरांक और विशेष रूपों के केवल निम्न सूची का उपयोग करें:
cons
,first
,rest
,empty?
,empty
,lambda
, औरcond
।
हालांकि, मजेदार बात, मैंने अध्ययन किया Y-combinator
और इस एक को हल करने में सक्षम था (कोडिंग के 6 बजे के बाद)।
जवाब
अपने बोनस भाग 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))
जो आपकी आवश्यकताओं की पूर्ति कर सकता है या नहीं।