以下代码的区别是什么?链接指的是链接列表对象。 .first()和.rest()属性分别返回第一个和剩余的值。根据StackOverFlow策略和我的类策略,我想提一下这不是一个赋值 - 它是一个很长的可选赋值,我正在重新审视它尝试迭代与递归研究我即将到来的考试。
以下是一些doctests。
>>> 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))
答案 0 :(得分:1)
metric_monitor
尝试将其作为递归版本....
答案 1 :(得分:1)
您的退货遗失或不合适。下降到递归时,您需要返回其各自的结果。此外,如果您的emtpy条件不成立,您需要返回一些内容:
existing = []
def cycle(link):
nonlocal existing
if link is not Link.empty:
if link in existing:
return True
existing.append(link)
return cycle(link.rest) # Return result of recursive call
else:
return False # Return false if link is empty
print(cycle(link))