我的任务是编写一个函数,该函数在给定 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,记录输出,瞧!
假设所有 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 运算符作弊。
如果 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))