Lah numbers: Difference between revisions
Content deleted Content added
m →{{header|Haskell}}: Pruning of some minor redundancy |
m →{{header|Haskell}}: Restored OP's formatting style. |
||
Line 467: | Line 467: | ||
<lang haskell>import Text.Printf (printf) |
<lang haskell>import Text.Printf (printf) |
||
import Control.Monad (when) |
import Control.Monad (when) |
||
factorial |
factorial :: Integral n => n -> n |
||
⚫ | |||
=> n -> n |
|||
factorial 0 = 1 |
factorial 0 = 1 |
||
factorial n = product [1 |
factorial n = product [1..n] |
||
⚫ | |||
lah |
|||
:: Integral n |
|||
=> n -> n -> n |
|||
lah n k |
lah n k |
||
| k == 1 = factorial n |
| k == 1 = factorial n |
||
| k == n = 1 |
| k == n = 1 |
||
| k > n = 0 |
| k > n = 0 |
||
| k < 1 || n < 1 = 0 |
| k < 1 || n < 1 = 0 |
||
| otherwise = f n `div` f k `div` factorial (n - k) |
| otherwise = f n `div` f k `div` factorial (n - k) |
||
where |
where |
||
f = (*) =<< (^ 2) . factorial . pred |
f = (*) =<< (^ 2) . factorial . pred |
||
printLah :: (Word, Word) -> IO () |
printLah :: (Word, Word) -> IO () |
||
printLah (n, k) = do |
printLah (n, k) = do |
||
when (k == 0) (printf "\n%3d" n) |
when (k == 0) (printf "\n%3d" n) |
||
printf "%11d" (lah n k) |
printf "%11d" (lah n k) |
||
main :: IO () |
main :: IO () |
||
main = do |
main = do |
||
Line 496: | Line 492: | ||
mapM_ (printf "%11d") zeroToTwelve |
mapM_ (printf "%11d") zeroToTwelve |
||
mapM_ printLah $ (,) <$> zeroToTwelve <*> zeroToTwelve |
mapM_ printLah $ (,) <$> zeroToTwelve <*> zeroToTwelve |
||
printf "\nMaximum value from the L(100, *) row:\n%d\n" |
|||
printf |
|||
(maximum $ lah 100 <$> ([0..100] :: [Integer])) |
|||
⚫ | |||
(maximum $ lah 100 <$> ([0 .. 100] :: [Integer])) |
|||
where |
|||
⚫ | |||
{{out}} |
{{out}} |
||
<pre>Unsigned Lah numbers: L(n, k): |
<pre>Unsigned Lah numbers: L(n, k): |