Python - 链接列表实现中的递归与迭代

时间:2016-10-20 05:57:18

标签: python recursion iteration

以下代码的区别是什么?链接指的是链接列表对象。 .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))

2 个答案:

答案 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))