0

私はプログラミングで数学のクラスを取っている物理学専攻です (私は数学のために入学しました) が、これまでどの言語でコーディングしたこともないので、Racket に関するすべてが私にとってまったく新しいものです。ここまでのクラスの目標は、セット関連の関数を取得し、Racket プログラムに変換することです。これらの関数の 1 つは、リストのリストを取得し、各要素の最初の項目を削除することです。

f({(0, 1, 0), (1, 0, 0), (1, 1, 1)...} = {(1, 0), (0, 0), (1, 1)。 ..}

これまでの手順としてこれを取得しました:

(define (procA set)
  (cond
    ((null? set) '())
    ((rest (first set)))
    ((procA (rest set)))))

プログラムを実行すると、適切な関数が適用されて返されますが、最初の要素のみが返されます。

(procA '((0 1 0) (1 0 0) (1 1 1)))

'(1 0) に戻ります。それはある種の「マップ」機能ですか、それともまったく異なるものですか? リストの残りの部分は最後の行で処理できると思っていましたが、そうではありませんでした。

4

2 に答える 2

1

@uselpa がコメントしたように、 と同じmap restです。それを実装したい場合は、再帰とcons結果のリストを一緒に使用する必要があります。

if最も簡単なアプローチは、空リストの基本ケースを見つけるために使用することだと思います。

(define (procB set)
  (if (null? set)
      '()
      (cons (rest (first set)) (procB (rest set)))))

を使いたい場合condは、同じように書くことができます

(define (procC set)
  (cond
    ((null? set) '())
    (else (cons (rest (first set)) (procC (rest set))))))

(elseこの場合、 は必要ありません: 省略した場合は、以下で説明する「本体のないテスト式」のケースにもなります。注: 単語elseを削除することのみを意味し、それに続く式を削除することは意味しません。)

つまり、コードに欠けているのはcons. コードでは、最後のステートメント (再帰を含む) は決して実行されません。これcondは、最初のテスト式が真 (かつ(rest non-empty-list)「真の」値) であることが選択されるためです。同様の例:

> (cond 
    ((= 1 2) 0)
    ((+ 3 4))
    ((+ 5 6)))
7

ここで、最初のテスト式は偽であるため、真である 2 番目の式に進みます。本体がないため、テスト式の結果は の結果になりcondます。3 番目の test-expression は実行されません。

于 2016-09-16T20:54:18.143 に答える