मुझे एहसास है कि यह एक पुराना धागा है, लेकिन यह पहली बार है जब मैं Google lisp flatten पर आता हूं। मैंने जो समाधान खोजा है वह ऊपर चर्चा की गई है, लेकिन प्रारूपण थोड़ा अलग है। मैं इसे समझाऊंगा जैसे कि आप लापरवाही के लिए नए हैं, क्योंकि जब मैं पहली बार इस सवाल को गुगल करता था, तो ऐसा लगता है कि अन्य भी होंगे।
(defun flatten (L)
"Converts a list to single level."
(if (null L)
nil
(if (atom (first L))
(cons (first L) (flatten (rest L)))
(append (flatten (first L)) (flatten (rest L))))))
उन नए लोगों के लिए, यह एक संक्षिप्त सारांश है।
निम्न पंक्ति वाणी एक समारोह कहा जाता है एक खाली सूची के लिए तर्क एल
(defun flatten (L)
साथ समतल चेकों नीचे लाइन।
(if (null L)
अगली पंक्ति शून्य हो जाती है क्योंकि एटीओएम नील एक प्रविष्टि (एटीओएम) के साथ एक सूची घोषित करता है। यह रिकर्सन का मूल मामला है और फ़ंक्शन को कब रुकना है, यह जानने देता है। यह जांचने के बाद की रेखा यह देखने के लिए कि सूची में पहला आइटम किसी अन्य सूची के बजाय परमाणु है या नहीं।
(if (atom (first L))
फिर, अगर ऐसा है, यह प्रत्यावर्तन इस परमाणु चपटा सूची है कि समारोह उत्पन्न होगा के बाकी के साथ संयुक्त का एक चपटा सूची बनाने के लिए उपयोग करता है। विपक्ष एक परमाणु को एक और सूची के साथ जोड़ता है।
(cons (first L) (flatten (rest L)))
यदि यह एक परमाणु नहीं है, तो हम उस पर समतल है, क्योंकि यह एक और सूची इसके अंदर आगे सूचियों हो सकता है है।
(append (flatten (first L)) (flatten (rest L))))))
संलग्न कार्य दूसरी सूची की शुरुआत में पहली सूची जोड़ देगा। यह भी ध्यान रखें कि हर बार जब आप lisp में फ़ंक्शन का उपयोग करते हैं, तो आपको इसे कोष्ठक से घिरा होना होगा। यह मुझे पहले उलझन में डाल दिया।
स्रोत
2013-11-14 01:09:11
आप कोष्ठक नहीं हटाते हैं। पेंटिचेस सूचियों के लिए मुद्रित प्रतिनिधित्व का सिर्फ एक पहलू हैं। आप जो कर रहे हैं वह सूक्ष्म सूचियां है। – Svante