* 꼬리 재귀호출과 패턴 매칭을 이용하여 구현한 팩토리얼과 피보나치 수열 계산
(*
Filename: fact.ml
Rapid factorial and fibonacci seq implementations
by pattern matching and tail recursive call
Execute: ocaml nums.cma fact.ml
or
Compile: ocamlc -o fact.exe nums.cma fact.ml
Execute: fact
Date: 2013. 2. 6.
Author: pkim __AT__ scripts.pe.kr
*)
open Printf
open Num
let bignum x = num_of_int x ;;
let to_string x = string_of_num x ;;
let rec fact n =
match n with
| 0 | 1 -> bignum 1
| k -> (bignum k) */ (fact (k-1)) ;;
let factorial n =
let rec loop acc k =
match k with
| 0 -> acc
| _ -> loop (acc */ (bignum k)) (k - 1)
in
loop (bignum 1) n ;;
let fibonacci n =
let rec loop a b k =
match k with
| 0 -> a
| _ -> loop (a +/ b) a (k - 1)
in
loop (bignum 1) (bignum 0) n ;;
let a = 30000 in
let b = 200000 in
printf "Factorial(%d) has %d digits\n" a (String.length (sprintf "%s" (to_string (factorial a)))) ;
printf "Fibonacci(%d) has %d digits\n" b (String.length (sprintf "%s" (to_string (fibonacci b))))
(*
Expected result:
Factorial(30000) has 121288 digits
Fibonacci(200000) has 41798 digits
*)
'프로그래밍 > OCaml' 카테고리의 다른 글
OCaml 언어, F# 언어. Haskell 언어로 각각 리스트 쉽게 생성하기 그리고 zipWith 을 이용한 행렬 곱셈 (0) | 2013.02.08 |
---|---|
OCaml 언어로 평방근, 입방근, n제곱근 구하는 함수를 구현하고 테스트하기 (0) | 2013.02.06 |
int 타입과 bigint 타입 간 상호 타입 변환 with OCaml (0) | 2013.02.03 |
Pollard's rho method 소개: 정수의 인수분해(factorizing integers) with OCaml (0) | 2013.02.02 |
스트링 리스트에서 스트링 찾기(find) with OCaml (0) | 2013.02.02 |