2014-11-20 4 views
5

I recently came across this question:मैं कैसे हास्केल में नेस्टेड कार्यों को लागू करते

कौन सा मूल रूप से कैसे च की सीमा (एन) की गणना करने के लिए इस समारोह को लागू करने के लिए पूछता:

enter image description here

मैं इस हास्केल में लागू करेगा कैसे ? मैं कार्यात्मक प्रोग्रामिंग सीखने की कोशिश कर रहा हूं और यह अब मेरे लिए एक अच्छी चुनौती है

उत्तर

10

तरीकों का एक समूह है!

f :: (Eq a, Floating a) => a -> a 
f n = f' n n 
    where f' 1 x = x 
     f' n x = let n' = n-1 in f' n' (n'/(1 + x)) 

हाथ से बाहर कार्य करना::

यहाँ एक एक पुनरावर्ती सहायक समारोह का उपयोग कर

f 1 = f' 1 1 
    = 1 
f 2 = f' 2 2 
    = f' 1 (1/(1 + 2)) 
    = 1/(1+2) 
f 3 = f' 3 3 
    = f' 2 (2/(1 + 3)) 
    = f' 1 (1/(1 + (2/(1 + 3)))) 
    = 1/(1 + (2/(1 + 3))) 

यहाँ एक पुनरावर्ती सहायक समारोह के साथ यह करने के लिए एक अलग तरह से है:

f :: (Eq a, Floating a) => a -> a 
f n = f' 1 n 
    where f' a n | a == n = a 
       | otherwise = a/(1 + f' (a+1) n) 

इसे हाथ से बाहर करना:

f 1 = f' 1 1 
    = 1 
f 2 = f' 1 2 
    = 1/(1 + f' 2 2) 
    = 1/(1 + 2) 
f 3 = f' 1 3 
    = 1/(1 + f' 2 3) 
    = 1/(1 + (2/(1 + f' 3 3))) 
    = 1/(1 + (2/(1 + 3))) 

पहला दृष्टिकोण पूंछ-पुनरावर्ती था जबकि दूसरा बस रिकर्सिव था।

या, लिंक का कहना है के रूप में एक गुना

f :: (Eq a, Floating a) => a -> a 
f n = foldr1 (\n x -> n/(1 + x)) [1..n] 

फिर से, हाथ से बाहर काम कर रहे:

f 5 = foldr1 (\n x -> n/(1 + x)) [1,2,3,4,5] 
    = g 1 (g 2 (g 3 (g 4 5))) 
    = g 1 (g 2 (g 3 (4/(1 + 5)))) 
    = g 1 (g 2 (3/(1 + (4/(1 + 5))))) 
    = g 1 (2/(1 + (3/(1 + (4/(1 + 5)))))) 
    = 1/(1 + (2/(1 + (3/(1 + (4/(1 + 5))))))) 
    where g = \n x -> n/(1 + x) 
+0

'' ap' Control.Monad' से निर्यात किया जाता है, तो मैं ' डी उस नाम का उपयोग करने से बचें। – Yawar

+0

आपके उत्तर के लिए धन्यवाद। यह समझने में मुझे कुछ समय लगेगा कि यह कैसे काम करता है लेकिन फिर धन्यवाद। – Krimson

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