我有一个用C语言编写的程序,它使用以下无上下文语法显示一个有效的,无上下文的语法字符串数(n <50):
S -> AA|0
A -> SS|1
我几乎没有关于如何做到这一点的概念,但经过越来越多的分析后,其中没有一个是正确的。
目前,我打算制作一个数组并随机更改[..., A, ...]
或[..., S, S, ...]
的{{1}},直到只有0和1,然后检查是否已经存在同样的事情随机生成。
我仍然不相信这是否是正确的方法,我仍然不知道如何做到这一点或在哪里保留最后的单词,因为基本形式将是一个不同长度的字符数组。另外,在C中,是一个字符的二维数组,等于字符串数组?
这是否有意义,这是一种正确的方法吗?或者我错过了什么?
答案 0 :(得分:2)
每次需要决定某事时,您都可以随意做出决定。例如:
function A():
if (50% random chance)
return "1"
else
return concat(S(), S())
function S():
if (50% random chance)
return "0"
else
return concat(A(), A())
多次调用S()
会给我这些输出:
"0"
"00110110100100101111010111111111001111101011100100011000000110101110000110101110
10001000110001111100011000101011000001101111000110110011101010111111111011010011
10000000101111100100011011010000000101000111110010001000101001100110100111111111
1001010011"
"11"
"10010010101111010111101"
语法的所有有效字符串。请注意,您可能需要稍微调整一下随机机会。此示例很有可能生成非常小的字符串,如"11"
。
答案 1 :(得分:0)
尝试将无上下文语法看作一组允许您在语言中生成新字符串的规则。例如,第一条规则:
S -> AA | 0
你怎么能用这种语言生成一个单词?一种方法是使用一个函数随机生成字符串“0”或两个A字,连接。
同样,要实施第二条规则:
A -> SS | 1
编写一个随机生成“1”或两个S字连接的函数。
答案 2 :(得分:0)
你问了几个问题......
关于问题: BT中的BTW,是字符串的二维数组吗?
是。
以下是声明字符串数组的方法,每个示例在使用方面表现出不同的灵活性:
char **ArrayOfStrings; //most flexible declaration -
//pointer to pointer, can use `calloc()` or `malloc()` to create memory for
//any number of strings of any length (all strings will have same length)
或
char *ArrayOfStrings[10]; //somewhat flexible -
//pointer to array of 10 strings, again can use `c(m)alloc()` to allocate memory for
//each string to have any lenth (all strings will have same length)
或
ArrayOfStrings[5][10]; //Not flexible - (but still very useful)
//2 dimensional array of 5 strings, each with space for up to 9 chars + '\0'
//Note: In C, by definition, strings must always be NULL terminated.
注意: 虽然这些表单中的每一个都有效,并且在正确使用时非常有用,但最好注意 {{3}每个人在实践中的表现方式。 。 (阅读链接以便对此进行讨论)