누군가가이 세분화에 관심이있는 경우, 추가 누적 기 매개 변수를 스레딩하여 Len 솔루션보다 조금 더 나은 성능을 발휘할 수 있습니다.
아이디어는 트리를 취하는 함수 store : 'a btree -> 'a option list
에서 이동 매개 변수로 전달 된 기존 리스트 트리의 요소를 추가하는 기능 store' : 'a btree -> 'a option list -> 'a option list
에리스트를 생성하는 것이다. 이 정의에
let rec store' t acc = match t with
| L x -> Some x :: acc
| N (a, b) ->
store' a (store' b (None :: acc))
이 요소 만 제는 임시
store a
목록을 작성하기 위해 사용하는 대신에, 최종 결과리스트에 한번 첨가되고, 다음
(@)
연산자를 통해 최종 결과로 두 번 첨부.
acc
전에
t
를 작성하는리스트의 최종 요소 순서의 직관을 제공하기 때문에
파라미터 순서가 중요하다 t
의 요소 acc
에 이미 존재하는 요소 전에 될 것이다. 이렇게하면 N
사례가 매우 자연스럽게 읽을 수 있습니다. 결과는 먼저 a
, 그 다음 b
, None
, acc
의 요소를 갖습니다.마지막으로
, 당신은 물론 store'
의 측면에서 store
를 정의 할 수 있습니다 :
let store t = store' t []
당신이 "낮은 수준을 노출하지 않으려는 경우 (두 번째 내부의 첫 번째 정의를 포장하는 관례 "기능) 따라서 내측 영역을 입력하지 않는) 사용자에게, 그리고 그것을 재귀 아니므로 충돌하지 않는 외부 정의와 같은 이름 (얻었다 : 물론
let store t =
let rec store t acc = match t with
| L x -> Some x :: acc
| N (a, b) ->
store a (store b (None :: acc))
in store t []
여부 이 정의는 렌의 1 d보다 "더 좋다". 귀하의 평가 기준이 무엇인지 알려줍니다. Len의 솔루션은 더 짧고, 읽기 쉽고, 원래 문제를보다 면밀히 매핑합니다.
(당신은 대신 엄격한 목록의 게으른 열거를 사용하여 두 세계의 최고를 얻을 수 있지만, 그것은 또 다른 이야기.이다) 그런데
,이 숙제는? 그것이라면 나쁜 것이 아닙니다.하지만 그렇게 말하는 것이 예의입니다. – Ashe
예, 그렇습니다. 마지막으로 D : D가됩니다. 나는 Ocaml이라는 개념을 가지고 있지만 앞으로는 결코 사용하지 않을 솔직히 말해서 좋다. –
놀랄 수 있습니다; 저는 제 직업에서 그것을 여러 번 사용했고, 학업 환경이라고 부르는 것이 아닙니다. 때로는 그저 직업에 적합한 도구 일뿐입니다. – Ashe