2012-09-23 10 views
5

स्केल और कार्यात्मक प्रोग्रामिंग सीखने के अभ्यास के रूप में, मैंने निम्नलिखित गैर पूंछ-रिकर्सिव डीफ़ को लागू किया जो किसी भी स्थान पर pascal's number की गणना करता है। कार्यक्रम स्वयं पास्कल के त्रिभुज की परिभाषा के रूप में कार्य करता है। यह सचित्र रूप के रूप मेंएरलांग बनाम जेवीएम (स्कैला) रिकर्सन प्रदर्शन

 1 
    1 1 
    1 2 1 
    1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
... 

def pascal(c: Int, r: Int): Int = 
    if (c == 0 || c == r) 1 else pascal(c - 1, r - 1) + pascal(c, r - 1) 

इस प्रकार है लेकिन जब पर मैक ओएस एक्स 10.6.8 pascal(25,50) के लिए भागने की कोशिश कर लग रहा है (2.53 गीगा इंटेल कोर 2 डुओ) यह अभी भी 20 मिनट के बाद चलना समाप्त नहीं हुआ है।

बस erlang साथ तुलना करने के लिए, मैं R15B02 स्थापित किया है और बराबर कार्यक्रम लिखा था इस प्रकार है: ~ 4sec में

-module(pascal). 
-export([calc_pascal/2]). 

calc_pascal(0,_) -> 1; 
calc_pascal(C,R) when C==R -> 1; 
calc_pascal(C,R) when C<R -> calc_pascal(C-1,R-1) + calc_pascal(C-1,R). 

pascal:calc_pascal(25,50) खत्म।

इतने बड़े प्रदर्शन अंतर का कारण क्यों हो सकता है? क्या jvm रिकर्सिव प्रोग्राम्स के लिए एरलांग रनटाइम के रूप में उन्नत नहीं है?

+0

स्केला कोड ग्रहण में संकलन और JUnit से, आरईपीएल से नहीं –

+2

'calc_pascal (सी -1, आर) चल रहा द्वारा चलाया गया था में पास्कल संख्या प्रदर्शन' 'calc_pascal होना चाहिए (सी, आर -1) ' –

+0

जो भी इसे कम करता है, उस पर टिप्पणी करनी चाहिए कि क्यों ... डाउनवॉटिंग पर पूछे जाने वाले प्रश्नों से: 'गंभीर रूप से मैला, कोई प्रयास-व्यय पोस्ट', जो स्पष्ट रूप से मामला नहीं है ... –

उत्तर

13

यदि मैं एरलांग संस्करण में किए गए स्कैला प्रोग्राम में एक ही गलती करता हूं, तो यह बहुत तेज़ चलता है। क्या यह कारण हो सकता है?

+0

ओह! Erlang कार्यक्रम सही किया और यह हमेशा के लिए भी चल रहा प्रतीत होता है। इंगित करने के लिए धन्यवाद। मुझे लगता है कि यह सुरुचिपूर्ण दिखने वाला पुनरावर्ती कार्यान्वयन स्केलेबल नहीं है :( –

3

एमएस

c,r  Scala Erlang 
10,20 21  22 
11,22 6  72 
12,24 16  272 
13,26 71  1034 
14,28 299  3982 
15,30 802  16124 
16,32 3885 60420 
संबंधित मुद्दे