2013-12-16 2 views
0

OCaml에 처음 100 개의 벨 번호를 계산해야하는 프로그램을 작성하고 있습니다. 이것은이 내 첫 번째 프로그램이다 OCaml의 벨 번호

let rec newton n k = 
    factorial n // (factorial k */ factorial (n-k)) 

let bell = Array.make 101 zero;; 
bell.(0) <- one;; 
bell.(1) <- one;; 

let i = ref 2 
let k = ref 0 
let x = ref zero 
let suma = ref zero 
let n = ref 100 

if !n != 0 || !n != 1 then 
    while !i <= !n do 
     while !k <= (!i-1) do 
      x := newton (!i-1) !k; 
      suma := !suma +/ (!x */ bell.(!k)); 
      k := !k + 1 
     done; 
     bell.(int_of_num !k) <- (!suma); 
     suma:= zero; 
     k:=0; 
     i:= !i + 1; 
    done;; 

bell.(int_of_num 20) 

:

open Num 
let one = num_of_int 1;; 
let zero = num_of_int 0;; 

계산 계승 :

let rec factorial n = 
    if n < 2 
    then one 
    else (num_of_int n) */ factorial(n-1) 

계산 뉴턴 여기에 (내가 Num 모듈을 사용하고 있습니다) 내 코드입니다 언어. 나는 컴파일하는데 약간의 문제가있다.

+0

예를 들어 구문에 대한 튜토리얼을 읽어야합니다. http://ocaml.org/learn/tutorials/. – Kakadu

+0

보다 구체적으로'while' 루프를'for' 루프로 다시 작성할 수 있습니다. 당신은 항상 integer 변수를 증가시킵니다. 그래서 for 루프가 필요한 것입니다. – Kakadu

+0

또한 오류 로그를 제공하여보다 구체적으로 문제를 지정해야합니다. 'let .. = ..'이 최상위 표현식으로'in'을 필요로하지 않는다는 것을 잊지 마십시오. 그러나'let'을'let' 안에 또 다른'let'을 사용하면'in' 키워드를 추가해야합니다. – Kakadu

답변

0

마지막 let n = ref 100 끝에 ;;이 누락되었습니다. 그러나 전역 변수를 알고리즘의 도우미 변수로 사용하는 것은 나쁜 스타일로 간주됩니다. 아래의 코드는 질문의 코드를 최소한으로 수정 한 것이며 이 아니며은 잘못된 스타일의 다른 측면을지지합니다. 예를 들어 설명에 언급 된 for 루프를 사용하지 않는 것입니다.

(* #load "nums.cma";; if in toplevel *) 
open Num 
let one = num_of_int 1;; 
let zero = num_of_int 0;; 

let rec factorial n = 
    if n < 2 
    then one 
    else (num_of_int n) */ factorial(n-1) 

let rec newton n k = 
    factorial n // (factorial k */ factorial (n-k)) 

let bell input = 
    let bell = Array.make (input+1) zero in 
    bell.(0) <- one; 
    bell.(1) <- one; 

    let i = ref 2 in 
    let k = ref 0 in 
    let x = ref zero in 
    let suma = ref zero in 
    let n = ref input in 

    if !n <> 0 || !n <> 1 then 
    while !i <= !n do 
     while !k <= (!i-1) do 
     x := newton (!i-1) !k; 
     suma := !suma +/ (!x */ bell.(!k)); 
     k := !k + 1 
     done; 
     bell.(!k) <- (!suma); 
     suma:= zero; 
     k:=0; 
     i:= !i + 1; 
    done; 

    bell.(input) 
+0

OK. 너의 도움을 위해 THX. – czarnywdowiec