You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码技术咨询:修正括号生成重复问题及结合逻辑表达式生成

问题1:修正合法括号组合生成的重复问题

你的代码在生成n≥5的括号组合时出现重复,主要有两个核心问题:

  1. 初始化错误:my_valid_parens[2]被错误设置为['()','()'],正确的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:结合两段代码生成带合法括号的逻辑表达式

要实现生成所有带合法括号的逻辑表达式,我们可以把问题拆分为两步:

  1. 生成所有可能的运算符组合(用itertools.product)。
  2. 对每个运算符组合,生成所有合法的括号化表达式(递归方式,本质和合法括号生成逻辑同源)。

这里不需要直接复用第一个问题的括号生成类,而是直接递归生成贴合逻辑表达式结构的括号化语句,完整代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:35