我的任务是编写一个函数,该函数生成一个给定n个运算符的表。真值表必须在列表中,表的每一行必须在单独的列表中(在主列表中)。
我知道解决方案涉及递归,但我似乎无法通过思考。
有人可以帮帮我吗?这只是作业的一小部分。
答案 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运算符作弊。