2016-09-01 6 views
6

この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) 
+4

_このようにnCrを計算しないでください。階乗が膨大な用語を生成するため、結果にはとにかく解消される(それが理論的には公式からの積分結果を得る唯一の理由です)ので、ひどく非効率です。適切な方法は、キャンセルしない用語だけを乗算し、何も分割しないことです。浮動小数点数についても心配する必要はありません。 – leftaroundabout

+0

@leftaroundについて、あなたはそれを答えにしてみませんか? – dfeuer

答えて

10

、あなたは分数のデータ型を使用する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) 

また、あなたはおそらくそれらの二項の数字を計算するために、より良いアルゴリズムを使用します。

+0

その階乗式では、小さな入力を期待している場合でも 'Integer'を使用する必要があります。 – leftaroundabout

2

あなただけroundを使用することができます。

print (round $ place 0 0)

これはあなたが望むものに書式設定を変更します。しかし、rednebの答えは、正しいアプローチです。

関連する問題