我试图通过首先为长度为4i的字符串设计NFA来解决这个问题,因为它的形式为0(mod 4)。
状态数= 4,我刚刚添加了2个其他状态,在此设计的每一端都有一个状态,并在0上转换,现在状态数= 6。我尝试检查时,我的解决方案是错的。有人可以解释我哪里出错了吗?
答案 0 :(得分:1)
这个NFA的高级设计是正确的,只有一些缺失的细节。我在设计NFA时发现有用的一个策略是首先提出一组测试用例或测试字符串。也就是说,如果我正在编写一个程序来检查字符串是否满足这些特定属性,我会测试哪些字符串?边缘情况会是什么?这些可以帮助您在首次设计NFA时发现模式,然后您可以使用它们来检查您的工作。
例如,以下是我将检查此问题的一些测试用例:
00 \\ i = 0
010100 \\ i = 1
0101011010 \\ i > 1, handles lengths of larger multiples of 4
011110, 000000 \\ it shouldn't matter what's in between the two 0s
111010100 \\ can have anything before the two 0s
010100111 \\ can have anything after the two 0s
... etc...
你应该特别考虑这两个:
000000
- 在您的NFA循环中,检查两个0之间的字符串长度是否为4的倍数,对此字符串的内容没有限制。具体来说,没有理由这个字符串的第一个字符不能是0(从q1到q5的转换)。 010100111
(和/或0101001110
,0101000
) - 这些都是字符串的示例,其中我们有两个0,由长度为4i的字符串分隔,后跟一些其他字符。这些字符串也应该被您的NFA接受,但目前不是 - 请记住,如果NFA接受完成处于接受状态,并且如果NFA需要进行转换并且不存在转换,则死了,那道路拒绝了。 您是否看到可以通过哪些修改来解决这些问题?