私は、n個の演算子を指定してテーブルを生成する関数を作成するという任務を負っています。真理値表はリストに含まれている必要があり、テーブルの各行は(メインリスト内の)個別のリストに含まれている必要があります。
解決策に再帰が含まれていることは知っていますが、それを完全に理解することはできないようです。
誰かが私を助けることができますか?これは、割り当てのごく一部にすぎません。
私は、n個の演算子を指定してテーブルを生成する関数を作成するという任務を負っています。真理値表はリストに含まれている必要があり、テーブルの各行は(メインリスト内の)個別のリストに含まれている必要があります。
解決策に再帰が含まれていることは知っていますが、それを完全に理解することはできないようです。
誰かが私を助けることができますか?これは、割り当てのごく一部にすぎません。
頭のてっぺんから考える最も簡単な方法は、2 ^ nをバイナリに変換してカウントダウンし、出力をリストに変換することです。
つまり、n = 3の場合:
真理値表:
a b c
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
2 ^ 3 = 8、8(バイナリ= 1000)、1000-1 = 111から開始し、0まで下げて、出力を記録し、出来上がり!
hkfによる質問の解釈が正しければ、これはRacketで機能するはずです。
#lang racket
(define (generate-table n)
(if (zero? n)
'(())
(for*/list ((y (in-list (generate-table (sub1 n))))
(x (in-list '(0 1))))
(cons x y))))
次のように使用します。
(generate-table 3)
> ((0 0 0) (1 0 0) (0 1 0) (1 1 0) (0 0 1) (1 0 1) (0 1 1) (1 1 1))
N個の演算子すべてがANDやORなどの二変数であると仮定しましょう。
;; Common Lisp
(defun truth-tables (ops)
(loop for op in ops
collecting
(loop for args in '((nil nil) (nil t) (t nil) (t t))
collecting (eval `(,op ,@args)))))
(truth-tables '(and or xor)) -> ((NIL NIL NIL T) (NIL T T T) (NIL T T NIL))
これはあなたにアイデアを与えます。さて、ここではサブリストとして「真理値表の各行」はありません。AND、OR、XORの真理値表の列がそれぞれあります。入力変数の組み合わせは暗黙的に残されます。すべての3番目のエントリがに対応することがわかります(<op> t nil)
。問題の説明はあまり明確ではありません。
ご覧のとおり、動的に評価される生成されたコードを介してLisp演算子を使用して不正行為を行いました。