このHaskellプログラムは "1.0"を印刷します。どのようにして "1"を印刷できますか? /
操作を使用することによりフォーマットHaskellで印刷するときに浮動小数点として
fact 0 = 1
fact x = x * fact (x-1)
place m n = (fact m)/(fact n) * (fact (m-n))
main = do
print (place 0 0)
このHaskellプログラムは "1.0"を印刷します。どのようにして "1"を印刷できますか? /
操作を使用することによりフォーマットHaskellで印刷するときに浮動小数点として
fact 0 = 1
fact x = x * fact (x-1)
place m n = (fact m)/(fact n) * (fact (m-n))
main = do
print (place 0 0)
、あなたは分数のデータ型を使用するHaskellのを求めています。この場合、おそらくあなたは望んでいないでしょう。 Int
またはInteger
のような積分型を使用することが好ましい。だから私は次を行うことをお勧めします: 1. 関数の型宣言を追加します。fact :: Integer -> Integer
のようにします。/
の代わりにquot
を使用してください。
だからあなたのコードは次のようになります。@leftaroundaboutが指摘したように
fact :: Integer -> Integer
fact 0 = 1
fact x = x * fact (x-1)
place :: Integer -> Integer -> Integer
place m n = (fact m) `quot` (fact n) * (fact (m-n))
main = do
print (place 0 0)
また、あなたはおそらくそれらの二項の数字を計算するために、より良いアルゴリズムを使用します。
その階乗式では、小さな入力を期待している場合でも 'Integer'を使用する必要があります。 – leftaroundabout
あなただけround
を使用することができます。
print (round $ place 0 0)
これはあなたが望むものに書式設定を変更します。しかし、rednebの答えは、正しいアプローチです。
_このようにnCrを計算しないでください。階乗が膨大な用語を生成するため、結果にはとにかく解消される(それが理論的には公式からの積分結果を得る唯一の理由です)ので、ひどく非効率です。適切な方法は、キャンセルしない用語だけを乗算し、何も分割しないことです。浮動小数点数についても心配する必要はありません。 – leftaroundabout
@leftaroundについて、あなたはそれを答えにしてみませんか? – dfeuer