तरीकों का एक समूह है!
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)
'' ap' Control.Monad' से निर्यात किया जाता है, तो मैं ' डी उस नाम का उपयोग करने से बचें। – Yawar
आपके उत्तर के लिए धन्यवाद। यह समझने में मुझे कुछ समय लगेगा कि यह कैसे काम करता है लेकिन फिर धन्यवाद। – Krimson