Lah numbers: Difference between revisions

Content deleted Content added
Hout (talk | contribs)
m →‎{{header|Haskell}}: An applicative pruning of some minor redundancy.
Line 467: Line 467:
<lang haskell>import Text.Printf (printf)
<lang haskell>import Text.Printf (printf)
import Control.Monad (when)
import Control.Monad (when)
import Control.Applicative (liftA2)


factorial :: Integral n => n -> n
factorial
:: Integral n
=> n -> n
factorial 0 = 1
factorial 0 = 1
factorial n = product [1..n]
factorial n = product [1 .. n]


lah
lah :: Integral n => n -> n -> n
:: 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 = (factorial n * factorial (pred n)) `div`
| otherwise = f n `div` f k `div` factorial (n - k)
where
(factorial k * factorial (pred k)) `div`
factorial (n - k)
f = (*) . factorial <*> (factorial . pred)


printLah :: (Word, Word) -> IO ()
printLah :: (Word, Word) -> IO ()
Line 492: Line 497:
mapM_ (printf "%11d") zeroToTwelve
mapM_ (printf "%11d") zeroToTwelve
mapM_ printLah $ (,) <$> zeroToTwelve <*> zeroToTwelve
mapM_ printLah $ (,) <$> zeroToTwelve <*> zeroToTwelve
printf
printf "\nMaximum value from the L(100, *) row:\n%d\n"
(maximum $ lah 100 <$> ([0..100] :: [Integer]))
"\nMaximum value from the L(100, *) row:\n%d\n"
(maximum $ lah 100 <$> ([0 .. 100] :: [Integer]))
where zeroToTwelve = [0..12]</lang>
where
zeroToTwelve = [0 .. 12]</lang>
{{out}}
{{out}}
<pre>Unsigned Lah numbers: L(n, k):
<pre>Unsigned Lah numbers: L(n, k):