【问题标题】:Generate all possible values for variables with recursion使用递归生成变量的所有可能值
【发布时间】:2019-02-07 07:46:36
【问题描述】:

我正在使用 Python 创建一个真值表,并且我已经迭代地这样做了,没有任何麻烦,但我试图弄清楚如何为任意数量的变量递归地生成 True 和 False 的所有可能值。

从如下列表开始:[[True], [False]]

我需要能够生成如下列表:

[[True, True, True], 
 [True, True, False], 
 [True, False, True], 
 [True, False, False], 
 [False, True, True], 
 [False, True, False], 
 [False, False, True], 
 [False, False, False]] 

每个列表都是真值表中的一行。

基于此,您遍历并评估每一行,根据正在评估的表达式将 true 或 false 的值附加到每个列表的末尾。

我已经迭代地解决了这个问题,但是递归地做它对我来说没有任何意义。我一直认为递归是从大开始变小(减少到基本情况)。就像在合并排序中一样。反之亦然。

我不能使用像 itertools 这样的东西。

赋值中的提示是“提示:您可以使用以下递归算法来创建真值表的所有变量组合:

  • 基本情况:对于单个变量,所有组合的列表为 [[True], [False]]
  • 递归情况:列表中的每个元素(它本身就是一个列表)都替换为两个列表,一个附加了 True,一个附加了 False。”

算法对我来说没有意义。

【问题讨论】:

  • 所以您想为 N 位长度的数据生成所有位变化?最简单的方法是将 2^N 数字转换为位,并分别读取每个位输出 True 为 1,False 为 0(反之亦然)。
  • 我假设算法是这样的。您想创建一个长度为3 的列表。你会得到一个列表列表[[True], [False]]。从[True][False] 的每个列表中创建两个列表。你将拥有[True, XXX][True, XXX][False, XXX][False, XXX]。现在,如描述中所述,您应该追加一次TrueFalse。所以...[True, True][True, False][False, True][False, False]。冲洗并重复。最后,您应该有一个包含 8 个列表的列表,每个列表包含三个元素。

标签: python recursion truthtable


【解决方案1】:

以下递归实现将起作用。请注意,您可以有一个更简单的基本情况:

def bool_combs(n):
    if not n:
        return [[]]
    result = []
    for comb in bool_combs(n-1):
        result.append(comb + [True])
        result.append(comb + [False])
    return result

>>> bool_combs(1)
[[True], [False]]
>>> bool_combs(2)
[[True, True], [True, False], [False, True], [False, False]]
>>> bool_combs(3)
[[True, True, True], [True, True, False], [True, False, True], [True, False, False], [False, True, True], [False, True, False], [False, False, True], [False, False, False]]

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多