为n个运算符生成真值表

时间:2012-04-23 03:01:12

标签: list functional-programming lisp scheme

我的任务是编写一个函数,该函数生成一个给定n个运算符的表。真值表必须在列表中,表的每一行必须在单独的列表中(在主列表中)。

我知道解决方案涉及递归,但我似乎无法通过思考。

有人可以帮帮我吗?这只是作业的一小部分。

3 个答案:

答案 0 :(得分:2)

我能想到的最简单的方法就是简单地将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,记录输出,瞧!

答案 1 :(得分:1)

如果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))

答案 2 :(得分: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真值表的列。输入变量组合是隐式的:您知道每个输入变量组合的第三个条目对应(<op> t nil)。您对问题的描述不是很清楚。

正如您所看到的,我通过生成的动态评估代码使用Lisp运算符作弊。