2012-11-13 38 views
11

संभव डुप्लिकेट:
what is the ‘cons’ to add an item to the end of the list?लिस्प में सूची के अंत में जोड़ा जा रहा है

तुतलाना पर कई ट्यूटोरियल देखकर और जवाब के लिए गूगल पर उच्च और निम्न खोज के बाद, मैं अभी भी समझ नहीं LISP में किसी सूची के अंत में कैसे जोड़ें।

मैं चाहता हूं कि मेरा कार्य 'a सूची '(b c d) के अंत में जोड़ें, लेकिन मुझे केवल यह पता है कि इसे आगे कैसे जोड़ना है। सूची के अंत में 'a जोड़ने के लिए कोई मुझे सही तरीके से विपक्ष का उपयोग करने में मदद कर सकता है? मेरा कोड यहाँ है। अग्रिम में धन्यवाद।

(defun AddRt (a list) 
    (cond 
    ((null list) 
     0) 
    (t 
     (princ (cons a (cons (car list) (cdr list)))) 
    ))) 


(AddRt 'a '(b c d)) 

उत्तर

5

आप एक पुनरावर्ती कार्य का उपयोग कर सकते हैं। इसके अलावा, आपको अंदर प्रिंस का उपयोग करने से बचना चाहिए।

निम्नलिखित समारोह, endcons, सिवाय इसके मूल्य अंत में जोड़ा जाता है, विपक्ष के रूप में बिल्कुल वही बात करता है।

(defun endcons (a v) 
    (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v))))) 

(endcons 'a '(b c d)) 

बेशक, आप भी संलग्न इस्तेमाल कर सकते हैं:

(append '(b c d) '(a)) 

भी देखें इस संबंधित सवाल: what is the 'cons' to add an item to the end of the list?

+0

अगर मैं प्रिंस का उपयोग नहीं करता, तो मुझे स्क्रीन पर आउटपुट (एंडकॉन 'ए' (बी सी डी)) के बारे में कैसे जाना चाहिए? आपके सहयोग के लिए धन्यवाद। – Bert

+0

आप बाद में प्रिंस का उपयोग कर सकते हैं, उदाहरण के लिए '(प्रिंस (एंडकन्स' ए '(बी सी डी))'। एक समारोह को परिभाषित करना हमेशा एक बुरा विचार है जो कुछ काम करता है और एक ही समय में आउटपुट करता है: यदि आप इसे कई बार उपयोग करना चाहते हैं तो क्या होगा और हजारों लाइनों कचरे से नाराज नहीं होना चाहते हैं? हमेशा «वास्तविक काम» और आईओ अलग करें। –

4

एक तरीका यह सूची उल्टा करने के लिए है। उलटा सूची की शुरुआत में तत्व जोड़ें। और फिर अंत में पूरी सूची को उलट दें।

योजना कोड:

(define (add-to-tail l x) 
    (reverse (cons x (reverse l))) 

लेकिन अगर यह एक ऑपरेशन आप अक्सर जरूरत है, तो मैं आप से (एकल जुड़े) सूचियों अन्य डेटा संरचना को खोजने के सुझाव देना चाहेंगे।

+0

धन्यवाद, मैं भी कोशिश करूँगा। – Bert

+1

मेरा मानना ​​है कि यह एक अच्छा दृष्टिकोण नहीं है: आप 2 रिवर्स पुनरावृत्तियों कर रहे हैं, जो एक महान सूची संख्या पर लंबा समय ले सकता है। –

+1

यह एक अच्छा मुद्दा है।एक लंबी सूची के लिए, अंतिम जोड़ी को बदलना बेहतर हो सकता है। ओपी ने भाषा निर्दिष्ट नहीं की थी। अपरिवर्तनीय (सिंगल लिंक्ड) सूचियों वाली भाषा में, विपरीत-दो बार विधि ही एकमात्र विकल्प है। म्यूटेबल सूचियों वाले भाषाओं के लिए रिवर्स-दो बार विधि छोटी सूचियों के लिए एक अच्छा विचार हो सकता है (इस पर बेंचमार्किंग के आसपास कोई रास्ता नहीं है)। यदि सूची को उलट दिया जाना है तो कई डेटा संरचनाओं के हिस्से के रूप में उपयोग किया जाता है, तो इसे म्यूटेट करना संभव नहीं हो सकता है। अंत में एक लंबी म्यूटेबल सूची के लिए, जिसका उपयोग केवल एक बार किया जाता है, 'रिवर्स!' का उपयोग करना बेहतर होता है। – soegaard

11

या तो last करने के लिए push, या का उपयोग nconc:

> (defparameter a (list 1 2 3)) 
A 
> (push 4 (cdr (last a))) 
(4) 
> a 
(1 2 3 4) 
> (nconc a (list 5)) 
(1 2 3 4 5) 
> a 
(1 2 3 4 5) 

टिप्पणी इन destructiveoperators, यानी, वे वस्तु जो मूल्य a की ही नहीं, a की बाध्यकारी है संशोधित हैं कि ।

यही कारण है कि, BTW, आप चाहिए कभी नहीं उपयोग nconc उद्धरण सूचियों पर, (nconc '(1 2 3) '(4 5 6)) की तरह।