3

次のものを作成する必要があります: 「proc2」という名前の Scheme プロシージャ。4 つの数値を引数として取り、最大の引数から最小の引数を引いた値を返します。

だから私は書きたい (define proc2 lambda(abcd) ... )

(> ab), (> ac), (> ad) を同時に評価する方法はありますか? ネストされた if を書かなくても、最大 (および最小) の数値を取得したい。

4

2 に答える 2

0

maxおよびminプロシージャを使用できますか? 答えが「はい」の場合、それは非常に簡単です。

(- (max a b c d) (min a b c d))

<そうでない場合、><=、は可変数の引数を受け入れるので、これは有効なコードであり、より小さいか、より小さいか、より小さい>=かを教えてくれることを覚えておいてください (ただし、 、、~のより多くの組み合わせをテストする必要があります)。が最小値であることを確認してください)。abbccdbcda

(< a b c d)

また、2 つ以上の数値が等しい場合を考慮することも忘れないでください (そのため、<=代わりにを使用することをお勧めします<)。

とにかく、条件を使用する必要があります。入れ子になったifs かもしれませんし、おそらくcond物事を単純にするための a かもしれません。詳細は自分で解決できます。これは宿題だと思います。

于 2012-11-11T22:30:20.870 に答える
0

リストの最小メンバーと最大メンバーを見つけたいが、標準のminおよびmaxライブラリ関数の使用が許可されていない場合、3 つの方法を考えることができます。

  1. 独自の min 関数と max 関数を記述します (ヒント: 再帰)。両方をリストに適用して、2 つの値を見つけます。減算を実行します。
  2. リストを 1 回通過し、最大値と最小値を含む別の 2 メンバーのリストを返す結合関数 (これも再帰的) を作成します。返されたリストの最初の要素が最大値の場合(apply - (find-min-and-max 3 2 8 7))find-min-and-maxが関数である場合、減算の結果が返されます。
  3. マップを使用します。

オプション 1 はオプション 2 よりも効率的ではありませんが、記述ははるかに簡単です。オプション 3 はどちらよりも複雑ですが、実際には要求したことを実行します (つまり、abcおよびdと「同時に」比較します)。

たとえば、次の関数を定義したとします。

(define (compare test x l)
  (map (lambda (y) (test x y)) l))

それから

(compare < 3 '(1 2 4))

戻るだろう(#f #f #t)

これはあなたにとってどのように役立ちますか?さて、(compare < x l)すべて true を返す場合、xlのすべての要素よりも小さいです。すべて false を返す場合、xlのすべての要素よりも大きくなります。したがって、mapを使用して必要なコードを作成できますが、それは見苦しく、最も効率的な方法ではないと思います。ただし、具体的に要求したことは実行します (リスト要素の複数の同時比較)。

于 2012-11-13T13:04:35.617 に答える