再帰しながらyieldする方法
再帰しながらyieldするには、どしたらよかんべか
2文木を左優先でじゅんぐりむっくりアクセスするには・・・
と思って書いてみた
なんとなく動いている
Public Overridable Iterator Function GetEnumerator() As IEnumerator(Of Node) Implements IEnumerable(Of Node).GetEnumerator Dim NodeSearch As Func(Of Node, IEnumerable(Of Node)) = Iterator Function(node As Node) As IEnumerable(Of Node) If node Is Nothing Then Return For Each x In NodeSearch(node.Left) Yield x Next Yield node For Each x In NodeSearch(node.Right) Yield x Next End Function For Each x In NodeSearch(Me.root_) Yield x Next End Function
VBおかしいよ、C#もだけど
余計なことかかずにこんだけ文量がかかる
やっぱり無理にyieldなんて構文ついかせんで、イテレータのブロック引数にもらって関数適用させたら分かりよいのに
GetEnumerator :: (Node -> a) -> Node -> a GetEnumerator f node = | node is null = () | otherwise = do GetEnumerator f node.Left ←このへん適当 f node GetEnumerator f node.Right
ちょっと構文知らないけどこんな感じだろうか
def GetEnumerator(proc, node) if node が nil なら return GetEnumerator(proc, node.Left) proc(node) GetEnumerator(proc, node.Right) end
よっぽど分かりよいわ