2016-10-04 4 views
4

나는 기능 프로그래밍을 배우는 것을 망치고 있었고 그렇게 할 수있는 ML을 선택하기로 결정했습니다. ML을 집어 들었을 때만 며칠이되었는데, 아마도 몇 가지 문제를 통해 총 5-6 시간을 보냈을 것입니다. 어쨌든, 내 문제에.표준 ML 피보나치 오버플로

일반적으로 언어를 배울 때 구문 및 작업에 대한 느낌을 얻기 위해 몇 가지 프로젝트 오일러 질문을 거칩니다. 그래서 저는 계승적인 기능을 필요로하는 문제에 대해 연구하고 있습니다. 계속해서 오버 플로우 오류가 발생하지만 다른 언어로 이것을 해결하기 위해 메모를 추가하거나 표준 라이브러리에 의존하지만 ML을 사용하는 나의 경험 부족으로 인해 메모 작성이 외국으로 보입니다.

fun fact_helper (0,r:int) = r 
| fact_helper (n:int,r:int) = fact_helper (n-1,n*r); 

fun factorial n:int = fact_helper(n, 1); 

심지어 표준 libs와 사용 :

foldl op * 1 (List.tabulate(100, fn x => x + 1)) 

가 오버 플로우가 발생합니다

것은 나는이 사용 꼬리 재귀하지만 주사위 같은 것을 시도했습니다.

나는 인터넷 검색을 한 적이 있지만 ML은 매우 희소 한 토론이나 커뮤니티를 갖고있는 것 같습니다. 그래서 제 질문은 모범적 인 방법으로 또는 일반적인 방법으로 ML에서 오버 플로우를 피하는 방법을 설명하는 예제입니다.

답변

6

문제는 구현시 데이터 유형에 의존하며, SML/NJ에서는 31 비트로 제한됩니다 (Int.precision 참조). 즉, 계산할 수있는 값의 상한값을 의미합니다. 그 모두 * 정수

open IntInf; 

fun fact_helper (0,r:int) = r 
    | fact_helper (n:int,r:int) = fact_helper (n-1,n*r); 

fun factorial n:int = fact_helper(n, 1); 

factorial 50; 
(* 30414093201713378043612608166064768844377641568960512000000000000 *) 
+2

참고 :

- (Option.valOf Int.maxInt) + 1; uncaught exception Overflow [overflow] raised at: <file stdIn> 

이 솔루션은 임의 정밀도 연산을 제공하는 IntInf 구조를 사용하는 것입니다 : 당신이 그 한계를 극복하려고하면, 당신은 Overflow 예외를 얻을 것이다 * 오버플로 및 * 스택 * 오버플로가 발생하면 동일한 예외가 발생하여 매우 혼란 스러울 수 있습니다. – sepp2k

+1

@ sepp2k 네가 맞아. 비록 내가 SML/NJ에서 스택 오버 플로우를 얻을 수 있다고 생각지 않는다. 이 꽤 구글이 어렵다 :) –

+0

사실, 내가 틀렸다. 오버플로 예외는 특히 표준에 따라 산술 오버플로를위한 것이며 스택 오버플로를 유발할 수있는 구현은 금지되어 있습니다. 적어도 예외는 없습니다. – sepp2k