我想写一个字符串生成器程序,当做递归部分时出错了。我真的想知道这有什么不对。如果你能就如何分析递归问题给我一些建议,我将非常感激。
代码可能有点长,这里可能需要一些耐心。非常感谢再次
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
我真的想知道我的代码中有什么问题。无限递归是如何发生的?