如何编写这种递归语法?

时间:2011-09-16 15:29:42

标签: coding-style grammar

我有以下语法:

S - > S {S} S | null

这里的null意味着什么都没有代替S. 我需要生成这个语法生成的所有可能的2n括号字符串。 我试过编码但程序内存不足。有人可以帮我编码2n个括号的语法吗?

提前多多感谢

2 个答案:

答案 0 :(得分:1)

首先,证明该语法生成​​平衡花括号的所有字符串。

(提示:首先证明S -> S{S} | null生成所有这些字符串。)

然后只需编写一个函数来生成所有这些:

function generate(num_opens, num_closes, string_so_far, N)
    if (num_opens + num_closes == N)
        print string_so_far;
        return;
    if (num_opens > num_closes)
        generate(num_opens, num_closes+1, string_so_far . '}', N)
    generate(num_opens+1, num_closes, string_so_far . '{', N)

generate(0, 0, N)

这可能是也可能不是问题的“精神”。

答案 1 :(得分:0)

为您准备了一些伪代码:

function grammar: S(string), n(int), generatedStrings(collection)
    if (|S| == 2*n)
        // Store in generatedStrings
        return
    else if (|S| > 2*n)
        return

    grammar(S + '{}', n, generatedStrings)
    grammar(S +'{'+ S +'}', n, generatedStrings)
    grammar(S +'{'+ S +'}'+ S, n, generatedStrings)
    grammar('{'+ S +'}'+ S, n, generatedStrings)
    grammar('{'+ S +'}', n, generatedStrings)
    grammar('{}'+ S, n, generatedStrings)

然后你只需要一些机制来确保不向生成的字符串集添加重复项。我会使用一个集合类型的数据结构(换句话说,一个只允许存储每个值之一的结构)。