ホームページ > バックエンド開発 > Golang > Go バイナリ ツリーの等価性演習でトラバーサルの終了を適切に通知するにはどうすればよいですか?

Go バイナリ ツリーの等価性演習でトラバーサルの終了を適切に通知するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-10 16:49:17
オリジナル
581 人が閲覧しました

How Can I Properly Signal the End of Traversal in a Go Binary Tree Equivalence Exercise?

Go ツアー演習 #7: バイナリ ツリーの等価性

Go ツアーでバイナリ ツリーの等価性演習を試行すると、次のような問題が発生する可能性があります。ツリーに要素がなくなったときのシグナリングの課題。指定されたコードはチャネルを使用してツリーからの値を通信しようとしますが、このシグナリングの問題に対処できません。

問題

再帰的走査中にチャネルを閉じる値の送信を途中で終了します。 Walk() 関数内で close(ch) を使用すると、すべての値が送信される前にチャネルが閉じられます。

クロージャーを使用した解決策

クロージャーを使用すると、匿名の周囲のスコープから変数を取得する関数。これを使用して、実行完了時にチャネルを自動的に閉じるカスタム ウォーク関数を生成できます。

func Walk(t *tree.Tree, ch chan int) {
    defer close(ch) // Automatically 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)
}
ログイン後にコピー

このソリューションでは、Walk() 関数はツリーの走査を処理するウォーク クロージャを返します。 。クロージャが終了すると、チャネルが自動的に閉じられ、これ以上送信する値がないことが示されます。これにより、受信側はトラバーサルがいつ完了するかを確実に判断できるようになります。

以上がGo バイナリ ツリーの等価性演習でトラバーサルの終了を適切に通知するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート