>백엔드 개발 >Golang >고루틴과 채널이 Go에서 두 바이너리 트리의 값을 효율적으로 비교할 수 있는 방법은 무엇입니까?

고루틴과 채널이 Go에서 두 바이너리 트리의 값을 효율적으로 비교할 수 있는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-15 18:10:181006검색

How Can Goroutines and Channels Efficiently Compare the Values of Two Binary Trees in Go?

Go Tour의 등가 이진 트리

이 연습에는 두 이진 트리가 동일한 값을 포함하는지 확인하는 작업이 포함됩니다. 구현 시에는 고루틴을 올바르게 사용하여 두 트리를 동시에 탐색하고 해당 값을 채널에 보냅니다. 그러나 트리에 더 이상 요소가 남아 있지 않다는 신호를 보내려고 할 때 문제가 발생합니다.

조기 폐쇄 방지

Walk에서 close(ch)를 사용하면 조기에 종료됩니다. 재귀가 일찍 종료되므로 모든 값이 전송되기 전에 채널을 닫습니다. 대신에 클로저를 사용하는 것이 우아한 솔루션입니다.

func Walk(t *tree.Tree, ch chan int) {
    defer close(ch) // Closes the channel when this function returns
    
    var walk func(t *tree.Tree)
    walk = func(t *tree.Tree) {
        if t == nil {
            return
        }
        
        walk(t.Left)
        ch <- t.Value
        walk(t.Right)
    }
    
    walk(t)
}

이 클로저는 ch 채널을 캡처하고 더 이상 통과할 노드가 없을 때만 닫히도록 보장합니다. defer close 문은 모든 재귀 호출이 완료된 후 클로저가 실행되도록 보장합니다.

이 수정을 통해 Same 함수는 채널에서 반복적으로 값을 수신하고 비교하여 동등성을 정확하게 결정할 수 있습니다.

위 내용은 고루틴과 채널이 Go에서 두 바이너리 트리의 값을 효율적으로 비교할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.