रैकेट में मैट्रिक्स हेरफेर

Nov 24 2020

मुझे एक फ़ंक्शन लिखने की ज़रूरत है जो पुनरावृत्ति का उपयोग किए बिना रैकेट में एक मैट्रिक्स के एनटी कॉलम का उत्पादन करता है। उदाहरण के लिए (list (list 1 2 3) (list 2 3 4) (list 6 7 9))अगर मुझे दूसरा कॉलम चाहिए था तो मुझे मिलेगा (list 2 3 7)

मैंने कोशिश की (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), लेकिन यह मुझे एक त्रुटि दिखाता रहता है।

जवाब

adabsurdum Nov 24 2020 at 09:32

प्रयास किया गया समाधान list-refदो बार उपयोग करता है , जिसकी आवश्यकता नहीं है, और उन कॉलों में से एक में पर्याप्त तर्क नहीं हैं: (list-ref M)फ़ंक्शन में केवल एक तर्क है, लेकिन इसके लिए दो तर्क - एक सूची और एक पूर्णांक की आवश्यकता होती है।

list-refसमारोह एक इनपुट सूची से एक अनुक्रमित तत्व वापस आ जाएगी, तो (list-ref '(1 2 3) 1)वापस आ जाएगी 2। विचार करें कि mapयहां क्या होगा: मैट्रिक्स को सूचियों की एक सूची (पंक्तियों की एक सूची) के रूप में दर्शाया गया है, अर्थात ((1 2 3) (2 3 4) (6 7 9))mapसमारोह इनपुट सूची के सदस्य है, जो सूची नहीं है पर कार्य करेगा (1 2 3), (2 3 4)और (6 7 9)। उस इनपुट पर फ़ंक्शन को mapपिंग करके list-ref, आप जो भी तत्व चाहें, सब्लिस्ट से ले सकते हैं। इसलिए, जैसा चाहें, (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))मूल्यांकन (2 3 7)करेंगे।

यहां एक फ़ंक्शन है जो आपको मैट्रिक्स से कोई भी कॉलम लेने देता है:

(define (nth-column M n)
  (map (lambda (row) (list-ref row n)) M))

नमूना बातचीत:

scratch.rkt> (define M '((1 2 3)
                         (2 3 4)
                         (6 7 9)))
scratch.rkt> (nth-column M 1)
'(2 3 7)
scratch.rkt> (nth-column M 0)
'(1 2 6)
scratch.rkt> (nth-column M 2)
'(3 4 9)