स्केल और कार्यात्मक प्रोग्रामिंग सीखने के अभ्यास के रूप में, मैंने निम्नलिखित गैर पूंछ-रिकर्सिव डीफ़ को लागू किया जो किसी भी स्थान पर 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 रिकर्सिव प्रोग्राम्स के लिए एरलांग रनटाइम के रूप में उन्नत नहीं है?
स्केला कोड ग्रहण में संकलन और JUnit से, आरईपीएल से नहीं –
'calc_pascal (सी -1, आर) चल रहा द्वारा चलाया गया था में पास्कल संख्या प्रदर्शन' 'calc_pascal होना चाहिए (सी, आर -1) ' –
जो भी इसे कम करता है, उस पर टिप्पणी करनी चाहिए कि क्यों ... डाउनवॉटिंग पर पूछे जाने वाले प्रश्नों से: 'गंभीर रूप से मैला, कोई प्रयास-व्यय पोस्ट', जो स्पष्ट रूप से मामला नहीं है ... –