【发布时间】:2016-10-20 05:57:17
【问题描述】:
下面的代码有什么不同?链接是指链表对象。 .first() 和 .rest() 属性分别返回第一个和剩余的值。根据 StackOverFlow 政策和我班级的政策,我想提一下,这不是一项作业——它是一项早就到期的可选作业,我正在重新审视它,尝试迭代与递归来学习我即将到来的考试。
这里有一些文档测试。
>>> s = Link(1, Link(2, Link(3)))
>>> s.rest.rest.rest = s
>>> has_cycle(s)
True
>>> t = Link(1, Link(2, Link(3)))
>>> has_cycle(t)
False
>>> u = Link(2, Link(2, Link(2)))
>>> has_cycle(u)
False
这是我对函数 def has_cycle(link) 的递归解决方案:
existing = []
def cycle(link):
nonlocal existing
if link is not Link.empty:
if link in existing:
return True
existing.append(link)
cycle(link.rest)
cycle(link)
return False
或者
existing = []
while link is not Link.empty:
if link in existing:
return True
existing.append(link)
link = link.rest
return False
谢谢。我应该提到迭代版本有效,递归版本无效。
链接列表类:
class Link:
"""A linked list.
>>> s = Link(1, Link(2, Link(3)))
>>> s.first
1
>>> s.rest
Link(2, Link(3))
"""
empty = ()
def __init__(self, first, rest=empty):
assert rest is Link.empty or isinstance(rest, Link)
self.first = first
self.rest = rest
def __repr__(self):
if self.rest is Link.empty:
return 'Link({})'.format(self.first)
else:
return 'Link({}, {})'.format(self.first, repr(self.rest))
【问题讨论】:
-
实际代码中的缩进是否正确?
-
我发布的缩进不正确吗?原谅我,我不太明白你指的是什么。
-
我假设
Link.empty产生True或False;如果是这样,您的条件if link is not Link.empty将永远不会成立,因为link不是boolean。只需将该条件更改为if not Link.empty即可。 -
在那种情况下,迭代解决方案应该永远不会工作?但确实如此。我不认为是这样。
-
好吧,然后向我们展示你的
Link类:) 嗯——你应该return cycle(link.rest)(返回它的结果,而不仅仅是调用它)。
标签: python recursion iteration