为什么我的Python函数不会递归/调用自己?

时间:2015-12-23 12:53:00

标签: python dictionary recursion

我正在制作一个字符串重写函数,它接受一个字符串并根据字典中的规则重写它。代码工作得非常好,但是我需要它自己调用n次并打印出第n个'重写的字符串。我需要递归的代码是:

S = "AB"
def srs_print(S, n, rules):
    '''
    A function that takes a dictionary as SRS rules and prints
    the output
    '''
    axiom = list(S)
    key =  []
    value = []
    output = ''

    for k in rules:
        #Inputs the keys of the rules dictionary into a new list
        key.append(k)
        #Inputs the value of the rules dictionary into a new list
        value.append(rules[k])

    for x in axiom:
        if x in key:
            axiomindex = key.index(x)
            output += value[axiomindex]
       else:
            output += x
    S = output
    return S
#j  =  srs_print(S, 5, {'A':'AB', 'B': 'A'})
#print(j)

#while len(range(n))  > 0:
#   S = srs_print(S, n, rules)
#   n = n-1
#print("The", n, "th rewrite is " )

#j = srs_print(S, 5, {'A':'AB', 'B': 'A'})
print(srs_print("A", 5, {'A':'AB', 'B': 'A'}))

这转变为" A"进入" AB"但是我需要把它放到' S'返回功能并再次运行。正如您所看到的,一些注释代码是我尝试使用但却失败的行。

我希望我能够很好地解释自己。

3 个答案:

答案 0 :(得分:0)

如果我理解正确,你会通过" n"以函数作为计算你需要调用它的次数的方法。

你可能可以将函数的整个主体包含在forwhile循环中。 无论如何你想要它是递归的,这里有它如何工作:

你需要有两个"返回函数的语句。一个返回结果(在您的情况下," S"),另一个返回srs_print(S, n-1, rules) 例如:

if n > 0:
    return srs_print(S, n-1, rules)
else:
    return S

我建议您花一些时间阅读this,以便更好地了解您想要做什么,以及它是否属于 >做。

答案 1 :(得分:0)

你绝对不需要递归。首先让我们以更加pythonic的方式重写你的函数:

def srs_transform(string, rules):
    '''
    A function that takes a dictionary as SRS rules and prints
    the output
    '''

    # the short way:
    # return "".join(rules.get(letter, letter) for letter in string)


    # the long way
    output = []
    for letter in string:
        transformed = rules.get(letter, letter)
        output.append(transformed)
    return "".join(output)

现在我们添加一个包装器函数,它将把srs_transform给定的次数应用于它的参数:

def srs_multi_transform(string, rules, times):
    output = string
    for x in range(times):
        output = srs_transform(output, rules)
    return output

现在我们只需要打电话:

print(srs_transform("A",  {'A':'AB', 'B': 'A'}, 5))

>> ABAABABAABAAB

答案 2 :(得分:0)

为什么不简单地使用for - 循环?

def srs_print(S, n, rules):
    for _ in range(n):
        S = ''.join(rules.get(x, x) for x in S)
    return S