2010-06-15 3 views
7

나는 목록을 살펴보고 정수 쌍을 반환하는 간단한 재귀 함수를 작성하려고합니다. .. 그래서ocaml 패턴 일치 질문

let rec test p l = ... ;; 
val separate : (’a -> bool) -> ’a list -> int * int = <fun> 
test (fun x -> x mod 2 = 0) [-3; 5; 2; -6];; 
- : int * int = (2, 2) 

문제이 C/C++/자바에서 쓰기 쉬운하지만 난 충돌에게 그것을해야

같은 이동을 입력하기 때문에 해결책을 찾기 위해 너무 어떻게 든 하드를 OCaml에 새로 온 사람 튜플에서 값을 재귀 적으로 반환하는 방법은 무엇입니까?

+2

이 함수가 반환해야하는 것에 대해 좀 더 자세히 설명해 주시겠습니까? 정수 쌍은 무엇을 나타내는가? – goggin13

+0

그래서 정수형 쌍을 (x, y)로 반환해야합니다. ocaml 에있는 튜플입니다. 문제는 단지 튜플 계산입니다. 따라서 목록의 요소가 소수 일 경우 x +1, y) else (x, y + 1) 그래서 반환 값은 (x, y)가 될 것입니다. x는 어떤 숫자보다 크고 y가 – REALFREE

답변

4

는 조금 OCaml의에서 떨어져 있었지만 나는 당신이 튜플의 조각을 꺼내 중첩 매치 문을 사용 할 수 있습니다이 주석

let rec test l = 
    match l with 
     [] -> (0,0) 
    | x::xs -> 
     if x > 0 then match (test xs) with (x,y) -> (x+1, y) 
     else match (test xs) with (x,y) -> (x, y+1);; 

에 realfree에의 설명에 관해서 트릭을 할 것입니다 생각 수정

편집 :

let rec test l = 
    match l with 
     [] -> (0,0) 
    | x::xs -> 
    if x > 0 then let (x,y) = test xs in (x+1, y) 
    else let (x,y) = test xs in (x, y+1);; 
: 나는 파스칼 Cuoq 아래 자신의 코멘트에 언급 된 구문에 대해 알고하지 않았다 , 여기에 같은 코드는 깔끔한 그리고 조금 짧은입니다

하지만 아직 받아 들여진 답변은 특히 꼬리 재귀와 함께 훨씬 더 좋습니다.

+2

만약 하나의 패턴으로'match .. with ...'를 쓰고 있다면'let x','y = test xs in ...' –

5

두 가지 유형, 빈 목록의 경우 int 또는 그렇지 않은 경우 튜플 인 두 가지 유형이 반환됩니다. 그것은 하나가되어야합니다.

또 다른 문제는 test에 1을 추가하려고하지만 test은 값이 아닌 함수입니다. 값을 반환하기 위해 다른 것을 테스트해야하지만, 그렇다고하더라도 튜플을 반환해야합니다. 튜플은 정수에 추가 할 수 없습니다.

코드에서 수행 할 작업을 파악할 수 없지만 해당 정보로 질문을 업데이트하면 도움이 될 수 있습니다.

let rec test l = 
    match l with [] -> 0 
    | x::xs -> if x > 0 then 1 + (test xs) 
       else test xs;; 

업데이트을 : 내가 가진

한 생각 엔 당신이 이런 식으로 쓸 수있는 경우 목록에서 양수를 계산하려는 당신이 명확하게 편집 한 이후 위의 코드를 다음과 같이 수정하십시오.

let test l = 
    let rec test_helper l pos nonpos = 
    match l with [] -> (pos, nonpos) 
    | x::xs -> if x > 0 then test_helper xs 1+pos, nonpos 
       else test_helper xs pos 1+nonpos 
    in test_helper l 0 0;; 

이 경우 누산기를 사용하면 많은 도움이됩니다. 또한 항상 좋은 연습 인 tail-recursive 함수를 만듭니다.

+0

보다 작습니다. 어떻게 순방향 재귀 적으로 수정할 수 있습니까? ? – REALFREE