我正在Udacity完成计算机科学101课程的介绍,我正在寻找一些帮助来解决最终的测验问题。以下代码返回了" pass"提交时,但我觉得我没有在这个测验中找到挑战的核心。任何有关如何处理和思考问题的帮助或建议都将受到赞赏。
问题:
"""
Define a Python procedure, in_language(<string>),
that takes as input a string and returns True
if the input string is in the language described by the BNF grammar below
(starting from S) and returns False otherwise.
BNF grammar description:
S => 0 S 1
S => 1 S 0
S => 0
"""
# Tests. These all should print True if your procedure is defined correctly
print in_language("00011") == True
print in_language("0") == True
print in_language("01") == False
print in_language("011") == False
print in_language("01002") == False
到目前为止,这是我的代码:
def in_language(bnf):
if len(bnf) % 2 == 0:
return False
if any(i in '23456789' for i in bnf) == True:
return False
if bnf[len(bnf)/2] != '0':
return False
else:
return True
对于给定Backus-Naur表单的提交不,此代码将返回True:
S => 0 S 1
S => 1 S 0
S => 0
,例如&#39; 11111011111&#39;
print in_language('11111011111') == False
我仍然围绕着递归,但看起来有办法递归地解决这个问题?或者我的下一步是检查字符串的第一个和最后一个字符,看它们是否只是零和一个(不是两个),然后删除它们并继续修剪字符串,直到我到达基本情况,或者,&#34;中间&#34;零。我很惊讶代码在这一点上通过了测验。
值得注意的是,我对代码的思考:
if len(bnf) % 2 == 0:
第一个if条件发生在我身上,因为给定B-N形式,任何迭代都会产生奇数个数字,因此字符串长度可分性为2表示不是那种形式的东西。
if any(i in '23456789' for i in bnf) == True:
第二个&#34; if&#34;也是一个简单的考虑,因为问题只是寻找由1和0构成的字符串(我想我也可以包括字母表,或者简单地写成if any(i not in '01' for i in bnf)
。
if bnf[len(bnf)/2] != '0':
第三个&#34;如果&#34;同样地寻找给定BN形式的限定特征 - 无论根据给定语法的表达式是什么,中间都会有零 - 并且使用Pythons floor division以及索引从零开始。 / p>
非常感谢任何有关替代解决方案的想法或建议,谢谢!
由于我是StackOverflow的新手,我在发布之前就研究了这个问题。任何发布样式注意事项(过于冗长?)或关注点也会有所帮助:)
好,
我采取了duskwoof的建议并想出了这个:
def in_language(bnf):
# corresponding to: S => 0 S 1
if bnf[0] == '0' and bnf[-1] == '1':
return in_language(bnf[1:-1])
# corresponding to: S => 0 S 1
if bnf[0] == '1' and bnf[-1] == '0':
return in_language(bnf[1:-1])
# corresponding to: S => 0
if bnf == '0':
return True
return False
并且它适用于跟随表单的情况,但是当我提交不具备的情况时,python barfs ...我仍然觉得有关于递归和解析Backus-Naur Forms的字符串的问题。如何处理不遵循表格的案件?感谢您的帮助。我会继续摔跤。
这似乎更好 - 通过所有测试用例:
def in_language(bnf):
if len(bnf) > 2:
# corresponding to: S => 0 S 1
if bnf[0] == '0' and bnf[-1] == '1':
return in_language(bnf[1:-1])
# corresponding to: S => 0 S 1
if bnf[0] == '1' and bnf[-1] == '0':
return in_language(bnf[1:-1])
# corresponding to: S => 0
if bnf == '0':
return True
return False
但同样,我完全是一个新的@编程,所以任何建议或意见都会非常有用......我仍然觉得我没有一个非常普遍的解决方案;这个特定的BNF语法特有的东西。
答案 0 :(得分:1)
我仍在围绕递归,但似乎有办法递归地解决这个问题?
不要试图通过分析这种语言中的字符串将具有哪些属性来解决问题(例如,长度为模2,它将包含哪些字符,等)!虽然这可能适用于这种特定的语言,但它一般不起作用;有些语言太复杂了,无法像你所描述的那样编写迭代解决方案。
您的解决方案应该直接翻译语言描述 - 您不必过多考虑规则的含义! - 并且应该对右侧有S
的规则使用递归。它应该写成以下形式:
def in_language(bnf):
if ...: # corresponding to: S => 0 S 1
return True
if ...: # corresponding to: S => 1 S 0
return True
if ...: # corresponding to: S => 0
return True
return False
(您目前拥有的解决方案是“错误解决方案” - 它将通过问题中给出的测试,但在某些其他输入上会失败。例如,字符串000
不是这种语言,但你的功能会说它是。)