2016-09-01 1 views
6

이 하스켈 프로그램은 "1.0"을 인쇄합니다. 어떻게 "1"을 인쇄 할 수 있습니까? / 작업을 사용하여Format 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

@leftaroundabout, 왜 대답하지 않으시겠습니까? – dfeuer

답변

10

, 당신은 소수 데이터 형식을 사용하는 하스켈을 요구하고있다. 이 경우에는 아마 원하지 않을 것입니다. 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의 대답은 올바른 접근 방식입니다.

관련 문제