代码技术咨询:修正括号生成重复问题及结合逻辑表达式生成
问题1:修正合法括号组合生成的重复问题
你的代码在生成n≥5的括号组合时出现重复,主要有两个核心问题:
- 初始化错误:
my_valid_parens[2]被错误设置为['()','()'],正确的2对合法括号应该是['()()', '(())']。 - 生成逻辑缺陷:直接对n-1的组合进行前后追加或包裹
(),会产生大量重复(比如从()()和(())都能生成()()()),虽然用set能临时去重,但这种方式效率低且逻辑不严谨。
正确的做法是基于卡特兰数的递归构造逻辑:对于n对合法括号,所有组合都可以表示为'(' + A + ')' + B,其中A是k对合法括号,B是n-1-k对合法括号(k从0到n-1)。这种方式能确保生成的组合完全不重复,无需依赖集合去重。
修正后的代码如下:
class Parenthesis(object): def __init__(self, parens): self.parens = parens # 修正初始化的合法括号组合 self.my_valid_parens = { 1: ['()'], 2: ['()()', '(())'] } def generate_valid_paren(self): if self.parens <= 2: return self.my_valid_parens[self.parens] i = 3 while i <= self.parens: new_combinations = [] # 用卡特兰数构造逻辑生成无重复组合 for k in range(i): # A是k对括号(k=0时为空字符串),B是i-1-k对括号 a_list = self.my_valid_parens[k] if k > 0 else [''] b_list = self.my_valid_parens[i-1 - k] for a in a_list: for b in b_list: new_combinations.append(f'({a}){b}') # 保险起见去重(理论上不会有重复) self.my_valid_parens[i] = list(set(new_combinations)) i += 1 return self.my_valid_parens[self.parens] if __name__ == '__main__': num = 5 p = Parenthesis(num) print(p.generate_valid_paren()) # 输出14个无重复的合法括号组合(卡特兰数C5=14)
问题2:结合两段代码生成带合法括号的逻辑表达式
要实现生成所有带合法括号的逻辑表达式,我们可以把问题拆分为两步:
- 生成所有可能的运算符组合(用
itertools.product)。 - 对每个运算符组合,生成所有合法的括号化表达式(递归方式,本质和合法括号生成逻辑同源)。
这里不需要直接复用第一个问题的括号生成类,而是直接递归生成贴合逻辑表达式结构的括号化语句,完整代码如下:
import itertools def generate_parenthesized_exprs(operands, ops): """递归生成所有合法括号化的逻辑表达式""" if len(operands) == 1: return [str(operands[0])] exprs = [] # 遍历所有分割点,将表达式拆分为左右两部分 for i in range(len(ops)): left_ops = ops[:i] right_ops = ops[i+1:] left_exprs = generate_parenthesized_exprs(operands[:i+1], left_ops) right_exprs = generate_parenthesized_exprs(operands[i+1:], right_ops) # 组合左右表达式并添加括号 for left in left_exprs: for right in right_exprs: exprs.append(f"({left} {ops[i]} {right})") return exprs def generate_all_logical_exprs(operands, operators): """生成所有带合法括号的逻辑表达式及计算结果""" # 生成所有可能的运算符组合(数量为操作数数量-1) for op_combination in itertools.product(operators, repeat=len(operands)-1): # 获取该运算符组合对应的所有括号化表达式 all_exprs = generate_parenthesized_exprs(operands, op_combination) # 去重避免重复输出相同表达式 unique_exprs = list(set(all_exprs)) for expr in unique_exprs: # 计算表达式结果并格式化输出 result = int(eval(expr)) print(f"{expr} = {result}") print() # 分隔不同运算符组合的结果 if __name__ == '__main__': operands = [0, 0, 0, 1] operators = ['|', '&'] generate_all_logical_exprs(operands, operators)
这段代码会输出所有可能的运算符组合对应的括号化表达式,比如你示例中的((0 | 0) | (0 & 1)) = 0会被包含在内。
内容的提问来源于stack exchange,提问作者Anwesha Patel
相关产品推荐
相关产品推荐

