私はhaskellでツリーの子を逆転しようとしています。私は、これは100%に動作するかどうかさえわからないハスケル:ツリーの子を再帰的に逆にするには
rev :: Tree v e -> Tree v e
rev (Node v []) = Node v []
rev (Node v xs) =
let xs' = (rev'(snd (unzip xs)))
in Node v (zip (fst (unzip xs)) (map rev xs'))
rev' :: [Tree v e] -> [Tree v e]
rev' [] = []
rev' (x:xs) = (rev' xs) ++ [x]
:私はこの2つの機能でそれを行う現時点で
data Tree v e = Node v [(e,Tree v e)]
:ツリーは次のようになります。 1つの関数で再帰的に行う方法はありますか?自分の道が非効率的だと感じる。
revRec :: Tree v e -> Tree v e
revRec (Node v []) = Node v []
revRec (Node v (x:xs)) = Node v (revRec xs ++ [x])
Obviosuly私はxs
リスト以来xs
とrevRec
を呼び出すことはできません:私はこのようになります関数を記述しようとしていました。私はちょうど私がそれが難しくないshoudn'tのように感じるにもかかわらず私はちょうどこの問題のまわりで私の頭を包むことができない。
、あなたも '回転を必要としない(ノードV [])= .. 'の場合、一般的なリストの場合は空のリストの場合もカバーします。第2に、 'unzip'を使うことは完全に合理的なようです - ' fst'と 'snd'(' unzip'への複数の呼び出し)の使用はおそらくなくすべきです。たとえば、プリミティブな再帰で書くことができます。 $ foldr(\(e、t)(as、bs) - >(e:as、bs。(rev)) 'rev(Node a ts)=ノードa $ uncurry(\ xy-> zip x t :)))([]、id)ts'である。しかし、私はこれが 'unzip/reverse'バージョンよりも効率的であることを本当に疑っています(それは確かに醜いです)。 – user2407038