2

2つのリストを取り、それらのXORを返すSMLの関数についてアドバイスを提供できる人なら誰でも、リスト[a、b、c、d]、[c、d、e、f]がある場合、関数は [a,b,e,f] を返しますか?

2つの関数でやろうとしましたが、それでもうまくいきません。

fun del(nil,L2) = nil
|del(x::xs,L2)=
if (List.find (fn y => y = x) L2) <> (SOME x) then
del(xs, L2) @ [x]
else 
del(xs, L2);

fun xor(L3,L4) = 
rev(del(L3,L4)) @ rev(del(L4,L3));
4

2 に答える 2

2

fn x => x = x常に true を返すため、意味をなさないことを除いて、あなたの試みはほぼ正しいようです。fn y => y = x代わりに欲しいと思います。

その他の注意点:

  • List.findの使用を、List.filter必要なものに近いものに置き換えることができます。

  • del(xs,L) @ [x]再帰的なステップにはしないでください。リストの最後に追加すると、最初のリストの長さに比例してコストがかかるため、すべてのステップで追加すると、関数の実行時間は 2 次になります。代わりに実行してくださいx :: del(xs,L)。これにより、最終的にリストの反転を削除することもできます。

  • ここで「XOR」と呼ぶものは、通常、少なくともセットのような構造の場合、対称差と呼ばれます。

于 2013-01-19T10:44:49.850 に答える