Life Goes On

まあまあだけど楽しんでる方です

65問目

http://projecteuler.net/index.php?section=problems&id=65
√2 の連分数展開を [1; 2,2,2, ...] と表記するとき、自然対数の底 e は [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...] と表現できる。分数にすると 2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ... となり、10番目の分数の分子の数字の和は 1+4+5+7=17 となる。同様に100番目の分数の分子の数字の和を求める。
最初に書いたコードはこれ。分子の漸化式を作って解いています。ふつーですね。

import Data.Char

main = print $ euler065 100

euler065 :: Int -> Int
euler065 n = sum $ map digitToInt $ show $ num !! n

num :: [Integer]
num = 1 : 2 : zipWith (+) num (tail $ zipWith (*) num exp')

exp' :: [Integer]
exp' = 2 : concat [[1, 2 * k, 1] | k <- [1..]]

で、フォーラムにあったコードがこれ。漸化式なんか作んなくたって計算させればいいじゃん、という考え方ですね。
foldrかぁ、かっこよすぎる。

import Data.Char
import Data.Ratio

main = print $ euler065 100

euler065 n = sum $ map digitToInt $ show $ numerator $ foldr1 (\ x y -> x + 1 / y) $ take n $ exp'

exp' :: [Rational]
exp' = 2 : concat [[1, 2 * k, 1] | k <- [1..]]