Python:关于递归函数的字符串生成器程序

时间:2017-05-25 10:02:52

标签: python recursion

我想写一个字符串生成器程序,当做递归部分时出错了。我真的想知道这有什么不对。如果你能就如何分析递归问题给我一些建议,我将非常感激。

代码可能有点长,这里可能需要一些耐心。非常感谢再次

def lit(s): return lambda Ns: set([s]) if len(s) in Ns else null
def alt(x,y): return lambda Ns: x(Ns) | y(Ns)
def opt(x,y): return alt(epsilon, x)
def seq(x,y): return lambda Ns: genseq(x, y, Ns)
def plus(x): return lambda Ns: genseq(x, star(x), Ns, startx=1)
def star(x): return lambda Ns: opt(plus(x))(Ns)

epsilon = lit('')
null = frozenset()

def ns(): return lambda n : set(range(n+1))

上面的代码是生成器中的基本功能,我将在这里举一些例子来帮助理解它们可以做什么。

>>> a = opt(lit('a'))
>>> b = lit('b')
>>> n = ns()

>>> print b(n(3))
set(['b'])

>>> print a(n(3))
set(['', 'a'])

>>> print seq(a,b)(n(3))
set(['b', 'ab'])

>>> print plus(b)(n(3))
set(['b', 'bb', 'bbb'])

>>> print star(b)(n(3))
set(['', 'b', 'bb', 'bbb'])

下面关于函数genseq()的代码是主要部分,我在这里有两个版本。

版本1(这是正确的版本):

def genseq(x, y, Ns, startx=0):
    "startx here is to avoid x keep returning '' " 
    if not Ns:
        return null
    xmatches = x(set(range(startx, max(Ns)+1)))
    Ns_x = set(len(m) for m in xmatches)
    Ns_y = set(n-m for n in Ns for m in Ns_x if n-m>=0)
    ymatches = y(Ns_y)
    return set(m1 + m2
               for m1 in xmatches for m2 in ymatches
               if len(m1+m2) in Ns) 

版本2(这是我写的版本):

def genseq(x, y, Ns, startx=0):
    if not Ns:
        return null
    Nsy = set(range(max(Ns)+1))
    Nsx = set(range(startx, max(Ns)+1))
    return set(m1 + m2
               for m1 in x(Nsx) for m2 in y(Nsy)
               if len(m1 + m2) in Ns)

使用我的版本时,会出现以下错误:

RuntimeError: maximum recursion depth exceeded in cmp

我真的想知道我的代码中有什么问题。无限递归是如何发生的?

0 个答案:

没有答案