【问题标题】:Python - Recursion vs. Iteration in a Linked List implementationPython - 链表实现中的递归与迭代
【发布时间】: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 产生TrueFalse;如果是这样,您的条件if link is not Link.empty 将永远不会成立,因为link 不是boolean。只需将该条件更改为 if not Link.empty 即可。
  • 在那种情况下,迭代解决方案应该永远不会工作?但确实如此。我不认为是这样。
  • 好吧,然后向我们展示你的 Link 类:) 嗯——你应该 return cycle(link.rest)(返回它的结果,而不仅仅是调用它)。

标签: python recursion iteration


【解决方案1】:
existing = []
def cycle(link):
    nonlocal existing
    if link is not Link.empty:
        if link in existing:
            return True
        existing.append(link)
        cycle(link.rest)
    else:
         return False

res = cycle(link)
#print res

试试这个作为你的递归版本....

【讨论】:

  • 那行得通。呃,这很简单。感谢您的帮助。我需要添加另一个返回循环(链接)。我错过了回报如何在高阶函数中工作。感谢您的宝贵时间。
【解决方案2】:

您的退货丢失或不合适。当下降到递归时,您需要返回其各自的结果。此外,如果您的 emtpy-condition 不成立,您需要返回一些内容:

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

【讨论】:

  • 你是对的!!非常感谢您的参与。我需要在高阶函数和递归中观察我的回报。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2014-07-22
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多