2011-12-24 5 views
2

할당은 트리를 미러링하는 것입니다 (모든 레벨에서 가장 왼쪽의 자식이 가장 오른쪽이됩니다).트리 미러링

데이터 구조 :

import Data.List 

data Rose a = Node a [Rose a] 
     deriving (Eq, Show) 

지금까지 올 것을 :

mirror :: Rose a -> Rose a 
mirror (Node x []) = Node x [] 
mirror (Node x (y:ys)) = mirror (myReverse y) 

--reverses given node children 
myReverse :: Rose a -> Rose a 
myReverse (Node x y) = Node x (reverse y) 

을 그래서 예를 들어이 코드를 실행하면

Main> mirror (Node 1 [Node 11 [Node 111 [], Node 112[]], Node 12 [Node 121[]]]) 

을 함수는 나를반환은 왼쪽 잎에 붙어있는 것을 의미합니다. 내 코드로 판단하면 논리적 인 것 같습니다. 주어진 노드의 꼬리를 y:ys에 전달하지 않기 때문입니다. 어떻게 든 주어진 노드 의 첫 번째 자식의 모든 자식을 동일한 함수에 대해 꼬리를 전달할 수 있어야합니다. 아무리 노력해도 나는 이것을 달성 할 수 없으며 논리적 사고의 한계에 부딪힌 것 같습니다. 올바르게 지적

Documentation for reverse function

답변

4

나는 첫 번째 아동과 나머지 어린이들과 같은 작은 용어로 생각하지 않을 것입니다. 대신, 전체 그림을 보려고하십시오. 우리가 반복적으로 이것에 대해 생각하는 경우

   a        a 
      / \      / \ 
      b  c  ===>   c  b 
     /| \ /\     /\ /| \ 
     d e f g h     h g f e d 

, 우리는 우리가 나무를 미러링 할 수 있음을 관찰 할 수있다 :

  1. 자녀들의 순서를 반대로.
  2. 아이들을 반복적으로 미러링합니다.

당신은 이미 reverse을 사용하는 방법을 알고 있습니다.목록의 모든 요소에 f 함수를 적용하려면 map f을 사용할 수 있습니다. 이들을 함께 사용하여 스스로 해결할 수 있는지 확인하십시오.

스포일러 :

mirror (Node a children) = Node a (reverse $ map mirror children)

+0

내장 된'map' 함수를 사용하여 주셔서 감사합니다. 또한, 나는 $ 표시가 괄호를 의미하는 것이 맞습니까? $ 기호가 없으면 스포일러 결과는'mirror (Node a children) = Node a (reverse (map mirror children))'가 될 것입니다. –

+0

@SYLARRR : 예,'$ '연산자의 우선 순위가 매우 낮으므로 대개 가능한 한 오른쪽으로 확장되는 큰 왼쪽 괄호처럼 생각할 수 있습니다. – hammar

+1

어,이 사이트에서 누군가가 스포일러를 사용하는 것을 본 적이 있습니다. 잘 했어. –

3

, 당신은 당신의 mirror 기능에 전혀 ys를 사용하지 않는, 그래서 결과는 가능성이 맞지 않을 수 있습니다.

이 문제를 해결하려면 Rose의 재귀 구조와 미러링이이 문제에 어떻게 영향을 미치는지 생각하는 것이 좋습니다.

즉, 나무를 비추기 위해서는 뿌리를 지키고 자녀의 순서를 바꾸면서 (반복적으로) 각각의 자녀를 반영해야합니다.

이것이 확실하다면, 그 단어들을 하스켈 코드로 번역해야합니다.

자신에게 질문

  1. 가 어떻게 아이들의 각 기능을 적용하고 목록에서 결과를 수집 할 수 있습니다?

  2. 역순으로 어떻게 할 수 있습니까?

  3. 빈 목록 케이스를 별도로 처리해야합니까?

+0

1. 아이들의 모든 기능을 적용하기 위해, 나는 재귀를 통과해야합니다. 목록의 머리를 차지하고 기능을 적용하고 같은 기능에 몸을 전달합니다. 모든 사용자 지정 데이터 형식 결과를 목록으로 수집하는 방법 - 잘 모르겠습니다. 그게 바로 문제의 원인입니다 ... 2. my helper 함수 'myReverse'실행 3. 아니요, 아니요 –

+0

@SYLARRR리스트의 모든 요소에 함수를 적용하려면'map'을 사용하십시오 : 지루한 모든리스트를 반복적으로 반복하므로, 다시 쓰지 않아도됩니다. – dave4420