euler 31

Nov. 15th, 2012 09:12 pm
[personal profile] sassa_nf
интересный урок.

сначала решение было вот такое:
split x = s x [1, 2, 5, 10, 20, 50, 100, 200]
  where s 0 _ = 1
        s x cs@(c:cs') = if x < c then 0 else ((s (x-c) cs) + (s x cs'))
        s _ _ = 0
Но беда здесь в том, что не tail call. Потом вместо (s (x-c) cs) подставил его значение, т.е. (s (x-c-c) cs) + (s (x-c) cs') и в два хода упростил до такого:
split x = length $ filter (==0) $ foldl f [x] [200, 100, 50, 20, 10, 5, 2, 1]
  where f xs c = [y | x <- xs, y <- [x,(x-c)..(x `mod` c)]]

Такой подход должен как-то называться. Где почитать?

(ну, потом вообще вот так:
split x = length $ foldl f [x] [200, 100, 50, 20, 10, 5, 2]
  where f xs c = [y | x <- xs, y <- [x,(x-c)..(x `mod` c)]]
)

Profile

sassa_nf

February 2026

S M T W T F S
1234567
891011121314
15161718192021
222324252627 28

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2026 07:03 am
Powered by Dreamwidth Studios