1

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

我知道解决方案涉及递归,但我似乎无法考虑清楚。

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

4

3 回答 3

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,记录输出,瞧!

于 2012-04-23T03:22:31.147 回答
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 运算符作弊。

于 2012-04-23T21:40:02.043 回答
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))
于 2012-04-23T03:32:48.847 回答