0

これが私の質問です: リストと int を受け取る関数を作成したいのですが、リスト内を再帰的に移動し、リスト内に int と等しい要素が見つかった場合は、リスト全体を返す必要があります。要素が削除され、何かが削除されたかどうかを示すブール値。これは私がこれまでに得たものです:

fun foo ([], n) = ([],false)
  | foo ((x::xs), n) = if x = n 
                       then (xs,true)
                       else ([x] @ foo(xs,n),false);

私の考えは、関数 cons を次のようにタプル内の必要な要素にすることでした:

([x0] @ [x1] @ [x2] @ [xs], true)

この関数を作成する方法はありますか?n に等しい要素にヒットしたら停止する必要がありますが、残りのリストは保持され、ブール値を返すことができることに注意してください。実行時間が重要です。

4

1 に答える 1

2

現在のコードは論理的にはほぼ正しいですが、ご存知のように、[x] @ foo (xs, n). foo直接追加できないタプルを返します。修正方法は次のとおりです。

fun foo ([], n) = ([], false)
  | foo (x::xs, n) = if x = n
                     then (xs, true)
                     else let val (xs', tf) = foo (xs, n) in (x::xs', tf) end

タプルからリストを抽出し、リストの最後に が見つかっletたかどうかを調べるために必要ですn。次に、タプルを元に戻し、xcons を前面に戻します。

于 2012-09-21T20:26:42.267 に答える