1

スキームでリストの要素を変更するにはどうすればよいですか。リストの最小要素を別の数に変更する手順が必要なので、

procというプロシージャがあり、それに2つの引数(リストと数値)を指定すると、プロシージャは次のように機能し (proc (list 1 2 3 1) 9)ます。returns '(9 2 3 9)。したがって、リストの最小値の代わりに9が使用されます。minを適用して最小値を取得できることは知っていますが、リストの1つの要素を変更する方法がわかりません。

Schemeには値を保持する変数がないので、letかletrecのどちらかを使うことを考えましたが、letとletrecのどちらを使うのかわかりません。

4

2 に答える 2

1

これは、2つの異なるタスクに分割できます。リスト内の最小値を取得してから、その値を新しい値に置き換えます。sortリストで関数を実行し、最小から最大に並べ替えてから、を使用apply minしてリストの最初の要素を取得することで、最小値を取得できます。

それを取得したらmap、リストを調べて、最小の番号のインスタンスを新しい番号に置き換えることができます。全体として、完全な関数は次のようになります。

    (define (replace-least lst new)
      (let ((lowest (apply min lst)))
        (map (lambda (x) (if (= x lowest) new x)) lst)))

私はこれをDrRacket5.3でテストしましたが、質問で提供された仕様に従って完全に機能しました。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-11-14T05:32:58.743 に答える
0

これは、以下を使用した改善された実用的なソリューションminです。

(define (replace-min lst elt)
  (let ((m (apply min lst)))
    (map (lambda (x) (if (= x m) elt x))
         lst)))

minこれが、リスト内の最小要素を見つける最も簡単な方法であることに注意してください。

于 2012-11-14T11:24:39.227 に答える