2012-04-23 9 views
1

n個の演算子を指定してテーブルを生成する関数を書くことが任されています。真理値表はリスト内になければならず、表の各行は別々のリスト(メインリスト内)になければなりません。n個の演算子の真理値表を生成する

解決策が再帰を伴うことは知っていますが、私はそれを考えることができません。

誰かが私を助けることができますか?これは割り当てのほんの一部です。

+2

手順 –

答えて

2

私が頭の上から考えている最も簡単な方法は、2^nをバイナリに変換してカウントダウンし、出力をリストに変換することです。 = 3 nの

すなわち:

真理値表:= 1000バイナリで

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-1 = 111から開始し、0にダウンあなたのように動作、記録的な出力、そしてボイルラ!

+0

非常に巧妙な答えのサンプル入力と予想される出力を投稿する必要があります。そのようなことは考えなかった。 –

1

あなたの質問のHKFの解釈が正しければ、これはラケットで動作するはずです:

#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)) 
1

はのは、すべてのN演算子はバイナリの機能は次のように、あると仮定しようとおよび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演算子を使用することをやめました。