2012-07-31 2 views
0

OCaml을 배우는 중이며 해결하려고하는 운동에 매달려 있습니다.출력 제한된 정수 범위의 OCaml

운동이 너무 좋아 그 정수까지의 모든 짝수 정수와 출력을하는 것입니다

입력 : 5 출력 : "0-2-4"

입력 : 10 출력 : "0-2-4-6-8"

음수 값, 문자열 입력 등의 오류를 포함해야합니다.

재귀 함수를 수행하고 패턴 매칭을 사용하여 가장자리 케이스를 설정하고 재귀를 중지 할 생각을했습니다.

내 문제는 루비에서 왔어. 루비에서 내 접근법은 단순히 입력 배열까지 정수 배열을 만든 다음 array.select, array.filter 등으로 해당 배열을 수정하는 것이다. 배열의 내용을 문자열로 연결하십시오. 나는 OCaml에서 이와 같은 일을하는 데 더 많은 어려움을 겪고있다.

팁이 있습니까?

let output_even_less_then n = 
    let rec outloop i n = 
    if i < n then begin 
     Printf.printf "%d\n" i; 
     outloop (i+2) n 
    end 
    in 
    outloop 0 n 

같은 뭔가

+0

어떤 시도를 했습니까? 꼬리 재귀'let rec'을 시도 했습니까? 어느 것? |> [] - 녹화 수를 N = 일치 N 하자 : 당신은 출력에 내가 같은 기본적인 재귀 함수를 시도 –

+0

n''주어진 몇 가지 이하도 정수를 적어도 기능이 필요합니다 (n mod 2 = 0) -> n :: count (n - 2) 이것은 기본 수준에서 작동 시키려고 노력하는 동안 발생합니다. – polyrhythm

답변

2

와 함께 완료 당신은 OCaml의에 루비의 접근 방식을 사용할 수 있으며, 실제로는이 방식으로 작동하는 것은 매우 관용적이다. 배열 대신에리스트를 사용하고 싶을 것입니다. 필자는 최대 정수 목록을 가져 오는 내장 함수를 알지 못합니다.하지만 정수를 작성하는 것은 쉽습니다. 그런 다음 List.filter을 사용하여 목록에서 원하는 요소를 선택할 수 있습니다.

추가 라이브러리를 사용할 수 있다면 OCaml Batteries Included에 많은 유용한 기능이 있습니다. BatList 모듈을 간단히 살펴 후, 나는 n보다 작은 정수의 범위에 대해이 기능을 함께했다 :

let range n = BatList.init n (fun x -> x) 
+0

함수의 결과를리스트 변수에 보내고 커맨드 라인에서 인자로 실행할 수 있도록하는 방법을 알 수는 없습니다. 예를 들어, 함수를 정의한 다음'let list = range n '을 말하면 그 시점에 n이 무엇인지 모르기 때문에 작동하지 않습니다. – polyrhythm

+0

"명령 줄"이 무슨 뜻인지 잘 모르겠습니다. 따라서 조언을하기가 어렵습니다. 자연스러운 일은 지금 무엇인지 모르는 값을 사용하고 싶다면 함수를 사용하는 것입니다! 설명에서'list'는'n'의 함수입니다. –

+0

의미 '범위'의 출력을리스트로 내보내고,리스트를 조작하고,'ocamlc'을 사용하여 컴파일 한 다음, 터미널에서 int 인자로 실행하고 터미널에서 인쇄 된 결과를보고 싶습니다. – polyrhythm

1

시작은 입력 및 유효성 검사

+0

Outlook에 한 걸음 더 나아가 목록에 추가 할 수있는 방법이 있습니까? 시도했다 'let count n = let clist = []; 만약 내가 polyrhythm

0

은 또한 시작을 이해하기 쉽게 할 수있는 간단한 while 루프를 사용할 수 있습니다. 이전 답변의 기능 스타일이 약간 더 효율적일 수 있습니다.

let exercise() = 
    let line = input_line stdin in 
    let n = 
     try int_of_string line 
     with e -> 
      Printf.eprintf "Could not parse line '%s'\n%!" line; 
      exit 1 
    in 
    if n < 0 
    then Printf.eprintf "%i is negative\n%!" n; 
    let i = ref 0 in 
    while !i < n do 
     Printf.printf "%i\n" !i; 
     i := !i + 2; 
    done 
;; 

exercise() 
관련 문제