2016-09-01 72 views
6

Bu Haskell programı "1.0" yazdırır "1" yazmasını nasıl sağlayabilirim? / operasyonu kullanarakBiçim Haskell'de yazdırırken Int olarak geçme

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

_Don't_ bu şekilde nCr'yi hiç hesaplamayın. Faktöriyel olarak sonuçların iptal edileceği büyük terimler ürettiği için (bu formülden teorik olarak ayrılmaz bir sonuç elde etmenin tek sebebi) korkunç bir şekilde verimsizdir. Doğru yol, yalnızca iptal etmeyen terimleri çoğaltmak ve hiçbir şeyi bölmemek; o zaman kayan nokta hakkında endişelenmenize de gerek yok. – leftaroundabout

+0

@leftaroundabout, neden bir cevap vermiyorsun? – dfeuer

cevap

10

, bir fraksiyonel veri türünü kullanmak için Haskell soruyorsunuz. Muhtemelen bu durumda bunu istemiyorsun. Int veya Integer gibi integral bir tür kullanılması tercih edilir. Bu yüzden aşağıdakileri yapmanızı öneririm: fact işlevi için fact :: Integer -> Integer gibi bir tür bildirim ekleyin. / yerine quot kullanın.

Yani kod aşağıdaki gibi görünmelidir: @leftaroundabout belirttiği gibi

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) 

Ayrıca, muhtemelen bu binom sayıları hesaplamak için daha iyi bir algoritma kullanmak istiyorum.

+0

Bu faktör formülüyle, sadece küçük girdiler beklediğinizde bile _must_ 'Tamsayı 'işlevini kullanırsınız. – leftaroundabout

2

sadece round kullanabilirsiniz:

print (round $ place 0 0)

Bu istediğiniz birine biçimlendirmeyi değiştirir. redneb'in cevabı, doğru yaklaşımdır.