2010-04-30 7 views
9

मैं इस हास्केल पावर फ़ंक्शन पूंछ को रिकर्सिव कैसे बनाऊंगा?आप इस हास्केल पावर फ़ंक्शन पूंछ को रिकर्सिव कैसे बनाते हैं?

turboPower a 0 = 1 
turboPower a b 
    | even b = turboPower (a*a) (b `div` 2) 
    | otherwise = a * turboPower a (b-1) 
+0

आपको कोड के सामने '>' की आवश्यकता नहीं है। बस चार रिक्त स्थान से इसे इंडेंट करें। –

+0

वैसे, आपको शायद 'div' के बजाय 'quot' का उपयोग करना चाहिए। साथ ही, ध्यान दें कि सामान्य '(^)' एक तेज़ एक्सपोनेंटिएशन एल्गोरिदम पर भी आधारित है। – dfeuer

उत्तर

10
turboPower a b = turboPower' 1 a b 
    where 
    turboPower' x a 0 = x 
    turboPower' x a b 
     | x `seq` a `seq` b `seq` False = undefined 
     | even b = turboPower' x (a*a) (b `div` 2) 
     | otherwise = turboPower' (x*a) a (b-1) 

असल में, आप क्या करना चाहते हैं गुणा है कि आप "otherwise" कदम में कर रहे हैं एक और पैरामीटर के लिए (के बाद से है कि क्या पूंछ पुनरावर्ती शुरू में किया जा रहा से इस रहता है) के लिए कदम है।

आलसी के बजाय सभी तीन पैरामीटर सख्ती से मूल्यांकन करने के लिए एक लाइन जोड़ने के लिए संपादित किया गया है, क्योंकि यह उन प्रसिद्ध परिस्थितियों में से एक है जहां आलस्य हमें चोट पहुंचा सकती है।

+0

ऐसा लगता है कि आप पूंछ रिकर्सिव संस्करण को संचयक तर्क में सख्त बनाना चाहते हैं। अन्यथा, गणना के परिणाम की मांग होने पर आपका टर्बोपावर शायद स्मृति थकावट का कारण बन जाएगा। –

+0

अच्छा बिंदु - और मैं इसे 'ए' में भी सख्त बनाना चाहता हूं। किया हुआ। –

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