2011-02-18 15 views
5

के बराबर रूबी लिंक कुल योग विधि के बराबर है। यह इससी # लिंक कुल विधि

var factorial = new[] { 1, 2, 3, 4, 5 }.Aggregate((acc, i) => acc * i); 

चर एसीसी हर बार सरणी अनुक्रम से मूल्य लैम्ब्डा को पारित कर दिया है संचित हो रही है की तरह कुछ काम करता है ..

+1

यह कहा जाता है 'reduce' - http: // विभिन्न भाषाओं में समकक्ष के लिए en.wikipedia.org/wiki/Fold_%28higher-order_function%29। – Gabe

+1

आपको शायद इस टिप्पणी को एक उत्तर देना चाहिए ताकि रमेश इसे स्वीकार किए गए उत्तर के रूप में चिह्नित कर सके। – chuckj

उत्तर

14

यह आमतौर पर गणित में गुना के साथ-साथ काफी किसी भी प्रोग्रामिंग भाषा कहा जाता है। यह कैटमोर्फिज्म की अधिक सामान्य अवधारणा का एक उदाहरण है। रूबी को इस सुविधा के लिए स्मॉलटाक से अपना नाम प्राप्त होता है, जहां इसे inject:into: कहा जाता है (aCollection inject: aStartValue into: aBlock. जैसा प्रयुक्त होता है) तो रूबी में इसे inject कहा जाता है। यह reduce पर भी उपनाम है, जो कुछ हद तक दुर्भाग्यपूर्ण है, क्योंकि इसका आमतौर पर कुछ अलग होता है।

आपका सी # उदाहरण रूबी में कुछ इस तरह दिखेगा:

factorial = [1, 2, 3, 4, 5].reduce(:*) 

हालांकि इन में से एक शायद और अधिक मुहावरेदार होगा:

factorial = (1..5).reduce(:*) 
factorial = 1.upto(5).reduce(:*) 
+0

धन्यवाद अंतर्दृष्टि के लिए जोर्ग ... – RameshVel

+0

मुझे अंकगणित के लिए 'प्रतीक # to_proc' पसंद है! –

+2

@ एंड्रयू ग्रिम: वास्तव में, यह 'प्रतीक # to_proc' नहीं है (गायब ampersand नोट करें)। 'संख्यात्मक # इंजेक्ट' में" ओवरलोड "है जो फोल्डिंग ऑपरेशन के लिए प्रतीक लेता है। यह उदाहरण के लिए 'संख्यात्मक # संग्रह 'के साथ काम नहीं करेगा। "Catamorphism" शब्द का उपयोग करने के लिए –

2

देखें Enumerable#inject

उपयोग:

a = [1,2,3,4,5] 
factorial = a.inject(1) do |product, i| 
    product * i 
end 
+1

@Gabe बताते हैं, इसके अलावा उपनाम 'कम' है, और यह वास्तव में गणितीय शब्द है। –

+0

अच्छा ... यह अपेक्षित के रूप में काम करता है ... :) – RameshVel

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