Python:基本L系统:公理和规则

时间:2018-02-23 00:40:34

标签: python function dictionary

我正在使用的测试(调用函数)是:

rewrite('A', {'A':'AB','B':'A'}, 2) >>> 'ABA'

rewrite('A', {'A':'AB','B':'A'}, 4) >>> 'ABAABABA'

rewrite('A', {'A':'AB','B':'A'}, 0) >>> 'A'

他们没有工作,我无法弄清问题是什么。这是一个L系统,它基本上将规则堆叠在另一个规则上,具体取决于用户请求的迭代次数,here is an example我的意思。 我知道这可以使用多个函数来完成,但我必须弄清楚如何在一个函数中运行它。

def rewrite(word, prod, n):

    start1 = list(prod.keys())[0]
    rule1 = list(prod.values())[0]
    start2 = list(prod.keys())[1]
    rule2 = list(prod.values())[1]
    newWord = ""

    if word == start1:
        newWord = rule1
        newWord1 = ""
        i = 0
        for i in range(n):
            for x in newWord:
                if x == start1:
                    newWord1 = newWord1 + rule1
                    newWord = newWord1
                    i += 1
                elif x == start2:
                    newWord1 = newWord1 + rule2
                    newWord = newWord1
                    i += 1
                else:
                    newWord1 = newWorld1

    if word == start2:
        newWord = rule2
        newWord1 = ""
        i = 0
        for i in range(n):
            for x in newWord:
                if x == start1:
                    newWord1 = newWord1 + rule1
                    newWord = newWord1
                    i += 1
                elif x == start2:
                    newWord1 = newWord1 + rule2
                    newWord = newWord1
                    i += 1
                else:
                    newWord1 = newWord1  

    else:
        newWord1 = word    # no rules apply so keep the character

    return newWord1

我知道我可以这样做,这种方式有效:

def rewrite(word, production, n):
    for i in range(n):
        newWord = ''
        for x in word:
            if x in production:
                newWord += production[x]
            else:
                newWord += x
        word = newWord
    return word

但是我花了很多时间在上面的那个,虽然它很复杂,但我想知道我是否走在正确的轨道上。

1 个答案:

答案 0 :(得分:0)

我认为这/这些行是你的问题:

i += 1

你不能像这样跳过python循环中的步骤。范围内的Python for循环不像其他语言那样工作。你可以随心所欲地操纵循环变量的值,但是下一次迭代仍将是它将会是什么。

所以基本上,你不会跳过你认为正在跳过的临时步骤。所以规则只是随意应用。