f #으로 싸우는 것 - 싸움은 나무의 영역에 있으며 특히 노드 수를 세는 것입니다. 이것은 결국 F #에서 멀티 - 웨이 나무에 관한 코드를 작성하고자하는 프로그램으로 불행히도 번거로운 시작이되어 버렸습니다. 아마도 도움이되기를 바랍니다!트리에서 노드 계산하기
99 f # 시리즈의 61 번 문제는 이진 트리의 잎 수를 계산하도록 요청합니다. (아래)이 솔루션은 노드를 계산하지만 내 문제는 이중 재귀 루프 왼쪽 어떻게 작동하는지
이해되지 않는다 (재미 LACC를 -> 루프를 잘 ..)
cont (branchF x lacc racc)
이 무엇인지을 내 인상은 계속이 "ABC"기능이라고했지만,이
loop t id
ID가 형 유닛으로 만 두 개의 매개 변수를 걸립니다 ... -이 함축되어 표시되지 않습니다
기본적으로이 내용을 이해하지 못하거나 트리를 통과하는 순서입니다 (디버그 & 단계는 도움이되지 않음). 간단한 예제가있는 경우 미리 읽는 것이 좋습니다. 어떤 도움
많은 감사, 문제의 해결책 코드는 다음과 같습니다 : 이름이 의미
건배
TD
type 'a Tree = Empty | Branch of 'a * 'a Tree * 'a Tree
let foldTree branchF emptyV t =
let rec loop t cont =
match t with
| Empty ->
cont emptyV
| Branch (x, left, right) ->
loop left (fun lacc ->
loop right (fun racc ->
cont (branchF x lacc racc)))
loop t id
let counLeaves tree =
foldTree (fun abc lc rc ->
if lc + rc = 0 then 1
else 1 + lc + rc) 0 tree
let Tree1 = Branch ('x', Branch ('x', Empty, Empty),Branch ('x', Empty, Branch ('x', Empty, Branch ('x', Empty, Empty))))
let result = counLeaves Tree1
해결책을 썼을 때 나는 무엇을 생각하고 있었는지 모르지만 리는 라이트이며 counLeaves의 "if"는 아무 것도하지 않습니다. 해결 방법은 다음과 같습니다 : counLeaves tree = tree |> foldTree (fun _ lc rc -> 1 + lc + rc) 0. 접기와 연속에 대해 더 알고 싶다면. 브라이언 맥나마라 (Brian McNamara)의 Catamorphisms에 대한 시리즈를 추천합니다. [link] (http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/). 그것이 fodlTree 함수가있는 곳입니다. –
안녕하세요 Cesar, 99 개의 문제 시리즈를 게시 해 주셔서 감사합니다. 정말 좋은 학습 도구입니다. 특히 여러 가지 솔루션이 있습니다. 건배! – dusiod
ID에 대한 질문에 아무도 대답하지 않은 것을 보면 "id"는 ID 연산자입니다. 같은 효과로 id를 (fun x -> x)로 바꿀 수 있습니다. http://msdn.microsoft.com/en-us/library/ee353607.aspx 또한이 코드에는 끔찍한 문제가 있습니다. 간단한 4 노드 트리를 만들었고 크기가 32라고했습니다. 모든 뉘앙스를 파악한 후에 올바른 구현을 게시 할 것입니다. –