递归获取链表的第N个值

时间:2013-10-11 06:30:55

标签: python python-2.7 recursion

我希望能够递归传递count或递增计数,然后将其传递给我的递归。但是,我知道我必须声明count = 0能够在递增时使用它。我还在学习python,我发现很难递归递增计数。有人可以帮我这个吗?

我知道目前我的代码是错误的,因为我做的每次递归,count都将重新发送到0.我不想将count设置为第3个参数,因为我觉得好像没有必要。

我的代码:

def getNth(head, n):
    count = 0
    if count == n:
        count += 1
        return head.value
    else:
        if head.next is not None:
            getNth(head.next,n)
        else:
            print 'not in linked list'

2 个答案:

答案 0 :(得分:2)

向后计数而不是向上计数。

def getNth(head, n):
    if n == 0:
        return head.value
    return getNth(head.next, n - 1)
然而,这会在实践中表现糟糕,如果你的列表有任何合理的长度,你会得到一个堆栈溢出。函数式编程风格通常不是很好的Python风格(例如,因为尾递归不是Python的一个特性)。

我只是写出循环。

def getNth(head, n):
   for _ in xrange(n):
       head = head.next
   return head.value

答案 1 :(得分:1)

这是在python中干净执行的递归中的常见模式,因此值得一提。

方法允许使用关键字参数,这对于跟踪递归深度非常有用。对方法签名的更改很简单:

def getNth(head, n, count=0):

0是{em>默认参数到count。只需在初始调用中将其保留(或使用count=0明确调用它),就可以了。然后,您可以使用getNth轻松递归调用getNth(*args, count + 1)

我现在应该注意到我已经解释过python中递归的速度很慢。如果你完全关心性能,你应该倾向于迭代解决方案(通常涉及生成器)而不是递归解决方案。