2017-11-03 16 views
0

나는이 작업을 uni에두고 오랜 시간 동안 연구했지만,이 함수를 작성하는 방법을 찾을 수 없다. . 리스트가 회문인지 확인하고, 대부분의 플로어 (n/2) 시간에 재귀 적으로 호출하고 보조 목록을 할당하지 않아야합니다. 그래서 목록 생성자를 사용할 수 없습니다. 아이디어가 있으십니까? Tbh, 전체 솔루션보다 알고리즘을 원합니다. 목록의 나머지 부분과의 처음부터 멀리 두 배 목록의 나머지 :OCaml 함수가 list (n/2) 재귀 호출과리스트 할당이없는 palindrome인지 확인한다.

+1

[도움말/on-topic] : * 3을 참조하십시오. 숙제 도움을 요청하는 질문에는 문제를 해결하기 위해 지금까지 해 온 작업의 요약과 문제 해결에 대한 설명이 포함되어야합니다. * "나는 오랫동안 연구했다"는 것만으로는 충분하지 않습니다. – glennsl

+0

예상되는 솔루션인지 확실하지 않지만 계속해서 확실하게 해결할 수 있습니다. (그것은 기본적으로 명시 적 단점을 사용하지 않고 링크 된 목록을 할당하고 있습니다) – Bergi

+0

'length'를 사용할 수 있습니까? – Bergi

답변

2

나는이 마련하고 그것을 작동 :

let palindrom l = 
let rec aux l0 l1 = 
    match (l0, l1) with 
    | _,[] -> (true,[]) 
    | hd :: tl, [x] -> (hd = x, tl) 
    | _, hd1 :: tl1 -> let (pal, ll) = aux l0 tl1 in 
      match ll with 
      | [] -> (pal, []) 
      | hd::tl -> (pal && hd1 = hd, tl) in 
match l with 
[] -> true 
| _ -> fst (aux l l) 
0

당신은 2 개 개의 인수를 취하는의 길에

  • 하는 재귀 도우미 기능을 사용할 수 있습니다 확인할 목록.
  • 은 점검 할 목록의 중간에 기본 케이스에 도달합니다 (두 번째 목록이 비어 있거나 홀수 길이의 경우 단일 요소 만있는 경우)
  • 출구에 목록을 option은 여전히 ​​보유하고 나머지는 어떤지 역에서 확인할 수 방법 - 또는 None 회문이

예 일치에 실패하는 경우 :

// in 
hannah hannah 
annah nnah 
    nnah  ah 
    nah  
// out 
    n <-> nah 
a <-> ah 
h <-> h