2009-03-19 15 views
5

मेरे पास ऐसा फ़ंक्शन है जो एक सूची लेता है जिसमें या तो दो या तीन तत्व होते हैं।मैं कैसे बता सकता हूं कि किसी सूची में तीसरी वस्तु है या नहीं?

;; expecting either ((a b c) d) or ((a b c) d e) 
(define (has-third-item ls) 
     (if (null? (caddr ls)) 
      false 
      true) 
    ) 

लेकिन इस कोड

mcar: expects argument of type <mutable-pair>; given() 
(अशक्त? (Caddr ls)) अभिव्यक्ति पर

साथ विफल रहता है।

मैं भी

(eq? '() (caddr ls)) 

कोशिश की, लेकिन यह या तो काम नहीं किया। मैं कैसे बता सकता हूं कि कोई तीसरा आइटम है या नहीं?

+0

बस उत्सुक। कृपया यह कौन सी भाषा है? –

+0

भाषा योजना है – Kai

उत्तर

9

आप कैडर नहीं चाहते हैं, अगर आप चाहते हैं (अगर (शून्य? (Cddr ls)) ... या सूची की लंबाई खोजने के लिए लंबाई का उपयोग करें, और उस मूल्य की तुलना करें जिसमें आप रुचि रखते हैं।

The '() है कि एक सूची समाप्त हो जाता है हमेशा एक जोड़ी की सीडीआर की स्थिति में होंगे, तो कार की स्थिति में यह तलाश में (जो सीएडी + r काम हो जाएगा) उत्पादक होने के लिए नहीं जा रहा है।

4

समस्या यह है कि अगर आप दो या कम आइटम के साथ एक सूची है, तो आप इसके बारे में caddr नहीं ले जा सकते है इस प्रयास करें:।

(define (has-third-item lst) 
    (<= 3 (length lst))) 

कुछ ऐसे मामले हो सकते हैं जहां सूची की लंबाई लेना अक्षम हो सकता है (जैसे सूची में लाखों आइटम शामिल हैं); इस मामले में, हम अगर सूची लंबाई शून्य है देखने के लिए, एक या दो हाथ से परीक्षण कर सकते हैं:

(define (has-third-item lst) 
    (not (or (null? lst) 
      (null? (cdr lst)) 
      (null? (cddr lst))))) 

संपादित करें:twoother जवाब के बारे में, जबकि cddr लेने इस मामले के रूप में में काम कर सकते हैं इनपुट डोमेन में दो या तीन तत्वों के साथ सूची होती है, जिसमें तीसरा-आइटम शून्य या एक के साथ सूचियों के लिए असफल हो जाता है। सामान्यता के हित में, मैं एक ऐसे समाधान के साथ जाने का सुझाव देता हूं जो किसी भी डोमेन के लिए काम करता है।

1

परंतु क्या आप जानते हैं तो आपकी सूची में दो या तीन तत्व है (जैसा कि आप कहते हैं कि यह है), तो आप

(define (has-third-item? l) 
    (not (null? (cddr l)))) 

आप जाँच कर रहे हैं दूसरी विपक्ष सेल चाहे (cddr l) एक cdr या नहीं कर सकते हैं। आपको यह जांचने की ज़रूरत नहीं है कि एल स्वयं शून्य है या एल में केवल एक तत्व है, जब तक कि आप अधिक सामान्य कार्य नहीं चाहते हैं।

0

कोशिश ...

(and l (cdr l)(cddr l)) 
0

क्यों (तीसरी ls) का उपयोग नहीं

तीसरा तत्व या शून्य वापसी करेंगे अगर कोई भी मौजूद है।

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

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