2012-01-11 4 views
5

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

(.indexOf [1 2 3 4 0 5] 
    (reduce #(if (< %1 %2) %1 %2) [1 2 3 4 0 5])) 

क्या इसे कम करके अलग-अलग करना संभव होगा?

उत्तर

13
 
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5]))) 
3 
+0

http://clojuredocs.org/clojure_contrib/clojure.contrib.seq-utils/indexed – opqdonut

+0

का उपयोग करके थोड़ा सा सरल बनाया जा सकता है ध्यान दें कि मुझे नहीं लगता कि उपर्युक्त टिप्पणी अब और सत्य है - 'अनुक्रमित' फ़ंक्शन प्रकट नहीं होता है क्लोजर 1.3 में मौजूद है। – candrews

4

मैं पाश का उपयोग कर सुझाव देंगे/अगर आप इस कुशलता से करना चाहता हूँ पुनरावृत्ति होना, शायद निम्नलिखित की तरह कुछ:

(defn min-index [v] 
    (let [length (count v)] 
    (loop [minimum (v 0) 
      min-index 0 
      i 1] 
     (if (< i length) 
     (let [value (v i)] 
      (if (< value minimum) 
      (recur value i (inc i)) 
      (recur minimum min-index (inc i)))) 
     min-index)))) 

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

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