【问题标题】:Generate truth table for n operators为 n 个运算符生成真值表
【发布时间】:2012-04-23 03:01:11
【问题描述】:

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

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

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

【问题讨论】:

  • 您应该发布该过程的示例输入和预期输出

标签: list functional-programming lisp scheme


【解决方案1】:

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

【讨论】:

  • 非常聪明的答案。没想到是这样的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    假设所有 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 运算符作弊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多