newB在Udacity Comp与Backus Naur挣扎。科学。 101

时间:2016-03-25 00:51:01

标签: python recursion python-2.x bnf

我正在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语法特有的东西。

1 个答案:

答案 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不是这种语言,但你的功能会说它是。)