2011-05-02 5 views
3

각 재귀는 고정 : I는 n 차 나무 각 재귀 내 자신을 쓰기에 문제가있어 수정 편집루비 - n 차 나무

얘들 아,

를 참조하십시오. @element은 노드의 값이고 @children은 연결된 모든 하위 노드의 배열입니다. 이것은 내 방법입니다 :

def each 
    yield(@element) 

    @children.each { |x| 
    x.each { |i| yield i} 
    } 
    self 
end 

문제는 하위 요소를 반복한다는 것입니다. 예를 들어, 이것을 사용하여 값이 o이고 자식이 c 인 노드를 인쇄하면 'oc'대신 'occ'이 인쇄됩니다. 나는 정말로 무슨 일이 일어나고 있는지 모르기 때문에, 시도한 모든 수정은 효과가 없다. 어떤 아이디어?

EDIT : 노드 값에 항복하는 것 외에도 각각 노드 값을 호출하기 때문에 이것이 가능할 수 있다고 생각합니다. 따라서 한 문자의 문자열 일 경우 .each 호출로 문자를 다시 생성합니다.

편집 편집 : 모두를 읽어 주셔서 감사합니다. 그러나 나는 엉망이되었습니다. 문제는이 방법이 아니라 동일한 클래스의 또 다른 문제에서 발생했습니다. to_s는 올바르게 인쇄되지만 문자열 인 경우 상위 노드의 값을 변경합니다. 내가 테스트 할 때마다, 나는 항상 처음에는 to_s를 사용했고, 심지어 그것을 깨닫지도 못했습니다. 이렇게되어 미안합니다. (나는 내 ​​자신의 질문에 답할 수 없다. 나는 초보자이기 때문에).

class Tree 
    def initialize element, children = [] 
    @element, @children = element, children 
    end 
    def each &pr 
    pr.call(@element) 
    @children.each{|x| x.each(&pr)} 
    self 
    end 
end 

a = Tree.new('self') 
b = Tree.new('parent', [a]) 
c = Tree.new('grandparent', [b]) 

c.each{|x| puts x} 
# => grandparent 
# => parent 
# => self 

b.each{|x| puts x} 
# => parent 
# => self 

한 통지가 당신이 반복적으로 PROC 객체를 전달하려는 것 때문에, 당신은 더 나은 가야한다는 것입니다 : 당신의 응답에서 판단

+0

이 클래스는 어떤 클래스에 정의됩니까? 코드를 클래스 본문으로 묶어야합니다. – sawa

+1

또한'@ element'와'@ children '이 n-ary 트리의 인스턴스에 정의되는 방법을 설명해야합니다. – sawa

+0

이것이 문제 영역이라고 생각해서 클래스가 생략되었습니다. 나는 더 이상 모르겠다. @element와 @children은 모두 생성자에 전달되고, @element는 어떤 객체로, @children은 배열로 전달된다. – Nathan

답변

3

, 당신이 원하는 것은이 같은 것을 날 것으로 보인다 그 숫자는 yield이 아닌 &pr입니다.

+0

괜찮아 보이지만 나쁜 점은 iterator를 만드는 블록없이 트리 객체의'each' 메소드를 사용할 수 없다는 것입니다. – DeTeam