2009-03-29 12 views
5

मेरे पास तत्वों की एक सूची है (ए बी सी) और मैं यह जानना चाहता हूं कि (सत्य या गलत) x इसमें है, जहां एक्स 'ए' या डी हो सकता है, उदाहरण के लिए। क्या इसके लिए कोई अंतर्निहित कार्य है?किसी सूची में तत्व खोजने के लिए योजना फ़ंक्शन क्या है?

+0

यह पता लगाने के लिए भाषा संदर्भ का उपयोग करें: http://schemers.org/Documents/Standards/R5RS//HTML/r5rs-ZH-9.html#%_sec_6.3.2 –

उत्तर

21

यदि आपको समकक्ष ऑपरेटरों में किसी एक निर्माण का उपयोग करके तुलना करने की आवश्यकता है, तो आप का उपयोग करके समानता की तलाश करना चाहते हैं, इसके आधार पर आप memq, memv, or member का उपयोग कर सकते हैं।

> (memq 'a '(a b c)) 
'(a b c) 
> (memq 'b '(a b c)) 
'(b c) 
> (memq 'x '(a b c)) 
#f 

आप देख सकते हैं, इन कार्यों sublist पहले मिलान तत्व से शुरू करता है, तो वे एक तत्व को खोजने के लौटने। ऐसा इसलिए है क्योंकि यदि आप ऐसी सूची खोज रहे हैं जिसमें बूलियन हो सकते हैं, तो आपको जिस तत्व को ढूंढ रहे हैं उसे ढूंढने के मामले से #f ढूंढने के मामले को अलग करने में सक्षम होना चाहिए। एक सूची एक सही मूल्य (योजना में केवल झूठे मूल्य #f है) है, इसलिए आप इस तरह के एक if, cond, and, या or अभिव्यक्ति के रूप में एक बूलियन, उम्मीद किसी भी सन्दर्भ में memq, memv, या member का परिणाम का उपयोग कर सकते हैं।

> (if (memq 'a '(a b c)) 
    "It's there! :)" 
    "It's not... :(") 
"It's there! :)" 

तीन अलग-अलग कार्यों के बीच क्या अंतर है? यह तुलना के लिए उपयोग किए जाने वाले समकक्ष कार्य पर आधारित है। eq? (और इस प्रकार memq) परीक्षण करता है कि दो वस्तुएं समान अंतर्निहित वस्तु हैं; यह मूल रूप से एक सूचक तुलना के बराबर है (या पूर्णांक के मामले में प्रत्यक्ष मूल्य तुलना)। इस प्रकार, दो तार या सूचियां जो दिखती हैं वे eq? नहीं हो सकती हैं, क्योंकि वे स्मृति में विभिन्न स्थानों में संग्रहीत हैं। equal? (और इस प्रकार member?) सूचियों और तारों पर गहरी तुलना करता है, और इसलिए मूल रूप से प्रिंट करने वाले किसी भी दो आइटम equal? होंगे।eqv? लगभग कुछ भी संख्याओं के लिए eq? जैसा है; संख्या के लिए, दो नंबर है कि संख्यानुसार बराबर हैं हमेशा eqv? होगा, लेकिन वे eq? नहीं हो सकता है

> (eq? 'a 'a) 
#t 
> (eq? 'a 'b) 
#f 
> (eq? (list 'a 'b 'c) (list 'a 'b 'c)) 
#f 
> (equal? (list 'a 'b 'c) (list 'a 'b 'c)) 
#t 
> (eqv? (+ 1/2 1/3) (+ 1/2 1/3)) 
#t 
(इस वजह bignums और तर्कसंगत संख्या है, जो मायनों में संग्रहित किया जा सकता हैं कि वे eq? नहीं होगा की है)

(ध्यान दें कि कार्यों में से कुछ व्यवहार विनिर्देश द्वारा अपरिभाषित है, और इस तरह कार्यान्वयन से कार्यान्वयन के लिए अलग हो सकता है, मुझे लगता है कि किसी भी आर आरएस संगत योजना कि सटीक परिमेय संख्याओं को लागू करता है में काम करना चाहिए उदाहरण भी शामिल है)

यदि आपको समकक्ष भविष्यवाणी का उपयोग करके किसी सूची में किसी आइटम की खोज करने की आवश्यकता है ई अलग से लोगों में बनाया में से एक है, तो आप find या find-tail से चाहते हो सकता है SRFI-1:

> (find-tail? (lambda (x) (> x 3)) '(1 2 3 4 5 6)) 
'(4 5 6) 
+0

के बजाय' memq' 'का नाम क्या है? – Freewind

+1

'memq' कार्यों के 'सदस्य' परिवार में से एक है, किसी प्रकार के समकक्ष (जैसे अन्य उल्लिखित, 'सदस्य' और 'memv') के आधार पर किसी सूची में किसी आइटम को ढूंढना। 'Q',' v', या पूर्ण नाम इसे तीन समकक्ष कार्यों से जोड़ता है जो वे प्रत्येक उपयोग करते हैं; समानता का परीक्षण करने के लिए 'memq'' eq? 'का उपयोग करता है, 'memv' समकक्ष परीक्षण करने के लिए' eqv? 'का उपयोग करता है, और' सदस्य' समानता का परीक्षण करने के लिए' बराबर 'का उपयोग करता है। उनके बीच के अंतर के लिए समकक्ष कार्यों पर लिंक किए गए दस्तावेज़ देखें। –

+0

धन्यवाद! तो 'memq' को' mem-q', और 'memv'' mem-v' के रूप में माना जा सकता है – Freewind

0

आप "लगता है" के लिए देख रहे

मूल बातें - सबसे सामान्य स्थिति अभी (प्रवेश सूची को खोजने) है, आम तौर पर एक विधेय के रूप में इस्तेमाल: "सूची में एंट्री है?"। यदि यह प्रश्न में तत्व ढूंढने में सफल होता है, तो यह केवल "टी" के बजाय पहला मिलान तत्व देता है। (दूसरी कड़ी से लिया।)

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node145.html

-या-

http://www.apl.jhu.edu/~hall/Lisp-Notes/Higher-Order.html

+0

सवाल, योजना के बारे में था नहीं सामान्य लिस्प। –

+0

ठीक है, उसने LISP को टैग किया। –

+0

शीर्षक पढ़ें: 'सूची में कोई तत्व ढूंढने के लिए SCHEME फ़ंक्शन क्या है?'। योजना लिस्प भाषाओं के परिवार में एक बोली है। –

3

यहाँ एक तरीका है:

> (cond ((member 'a '(a b c)) '#t) (else '#f)) 
#t 
> (cond ((member 'd '(a b c)) '#t) (else '#f)) 
#f 

सदस्य सब कुछ देता है जहां तत्व है से शुरू , या # एफ। एक कंड का उपयोग इसे सही या गलत में बदलने के लिए किया जाता है।

+0

'# t' ठीक है, '# t' –

0

अगर वहाँ एक समारोह में बनाया मैं नहीं जानता, लेकिन आप एक बना सकते हैं:

(define (occurrence x lst) 
     (if (null? lst) 0  
      (if (equal? x (car lst)) (+ 1 (occurrence x (cdr lst))) 
            (occurrence x (cdr lst)) 
      ) 
     ) 
) 

आप सूची में x की घटनाओं की संख्या में वापसी करेंगे। आप इसे true या false के साथ भी बढ़ा सकते हैं।

संबंधित मुद्दे