2011-12-12 18 views
5

में मैं मानक तरीका लिस्प में नकारात्मक अनन्तता का प्रतिनिधित्व करने के लिए देख रहा हूँ। वहाँ एक symblic मूल्य है जो सभी अन्य नंबरों से भी कम समय के रूप में लिस्प के गणित कार्यों द्वारा मान्यता प्राप्त है है?नकारात्मक अनंत लिस्प

विशेष रूप से, मैं निम्नलिखित लिखने के लिए एक सुंदर तरीका के लिए देख रहा हूँ:

(defun largest (lst) 
    "Evaluates to the largest number in lst" 
    (if (null lst) 
    ***negative-inifinity*** 
    (max (car lst) (largest (cdr lst))))) 

उत्तर

7

एएनएसआई कॉमन लिस्प bignum है, जो जब तक आप पर्याप्त स्थान के रूप में मनमाने ढंग से बड़ी संख्या का प्रतिनिधित्व करते थे सकता है, लेकिन यह एक "अनंत निर्दिष्ट नहीं करता "मूल्य। कुछ कार्यान्वयन हो सकता है, लेकिन यह है कि मानक का हिस्सा नहीं है। एक सूची में सबसे बड़ी संख्या खोजने:

आपके मामले में, मैं तुम्हें अपने कार्य करने के उद्देश्य के आधार पर अपने दृष्टिकोण पर पुनर्विचार करने की मिल गया है लगता है। एक खाली सूची में सबसे बड़ी संख्या खोजने की कोशिश कर अवैध/बकवास है, हालांकि है, तो आप उस मामले के लिए उपलब्ध कराना चाहते हैं। तो अगर आप एक पूर्व शर्त परिभाषित कर सकते हैं, और अगर यह मुलाकात नहीं कर रहा है, nil वापसी या एक त्रुटि बढ़ा। वास्तव में यह है कि अंतर्निहित फ़ंक्शन max करता है।

(apply #'max '(1 2 3 4)) => 4 
(apply #'max nil) => error 

संपादित करें: रेनर Joswig द्वारा बताया के रूप में, कॉमन लिस्प arbitrarily long argument lists की अनुमति नहीं है, इस प्रकार यह सबसे अच्छा है reduce बजाय apply उपयोग करने के लिए।

(reduce #'max '(1 2 3 4)) 
+0

धन्यवाद। मुझे पता नहीं था कि अधिकतम तर्कों की मनमानी संख्या लेती है, लेकिन यह एक सुरुचिपूर्ण समाधान प्रदान करता है। – jforberg

+4

चूंकि सामान्य लिस्प में फ़ंक्शन मनमाने ढंग से लंबी तर्क सूचियों की अनुमति नहीं देते हैं, इसलिए APPLY को RedUCE के साथ प्रतिस्थापित करना सबसे अच्छा है। परिवर्तनीय कॉल-ARGUMENTS-LIMIT के मान देखें। एक कार्यान्वयन कॉल-ARGUMENTS-LIMIT लंबी तर्क सूचियों तक का समर्थन करता है। आपके उदाहरण में इसका अर्थ यह होगा कि एक कार्यान्वयन कॉल-ARGUMENTS-LIMIT + 1 लंबी सूचियों पर अधिकतम गणना करने में विफल हो सकता है। ध्यान दें कि यह कॉल-ARGUMENTS-LIMIT का मान 50 (!) जितना छोटा हो सकता है। –

+0

@RainerJoswig: ओह आप पूरी तरह से सही हैं। – Daimrod

3

कि एएनएसआई कॉमन लिस्प में ऐसा कुछ नहीं है। सामान्य लिस्प कार्यान्वयन (और यहां तक ​​कि गणित अनुप्रयोग) नकारात्मक अनंतता के उनके प्रतिनिधित्व में भिन्न होते हैं।

डबल तैरता के लिए LispWorks में उदाहरण के लिए:

CL-USER 23 > (* MOST-NEGATIVE-DOUBLE-FLOAT 10) 
-1D++0