python递归中的LinkedLists

时间:2017-10-18 15:38:24

标签: python recursion linked-list

我在python中有一个简单的LinkedList实现。如何在方法中使用递归?我知道递归是如何工作的,但我如何使用自我递归。如果有人可以修复我的代码,但我对解释更感兴趣,那么我可以在不同的方法中使用它。

LinkedList代码:

class Node:
    def __init__(self, item, next):
        self.item = item
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None

    def add(self, item):
        self.head = Node(item, self.head)

    def remove(self):
        if self.is_empty():
            return None
        else:
            item = self.head.item
            self.head = self.head.next
            return item

    def is_empty(self):
        return self.head == None 

我的代码是:

def count(self, ptr=self.head):
    if ptr == None:
        return '0'
    else:
        return 1 + self.count(ptr.next)

它给了我一个错误:

def count(self, ptr=self.head):
NameError: name 'self' is not defined

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

在Python中默认参数是不是在运行时评估的表达式。这些是在评估def时评估的表达式。所以对于class通常是第一次读取文件时。

结果,在那一刻,没有selfself是一个参数。因此,仅当您调用函数时才可以使用。

您可以使用例如None作为默认值来解决该问题并执行检查。但是在这里我们不能使用None,因为你已经附加了一个特殊的含义。但是,我们可以构造一个dummy对象,并使用它:

dummy = object()

def count(self, ptr=dummy):
    if ptr is dummy:
        ptr = self.head
    if ptr == None:
        return '0'
    else:
        return 1 + self.count(ptr.next)

您的代码的另一个问题是返回零的字符串。由于您不能简单地添加整数和字符串,这将是错误的。所以你应该返回一个整数:

dummy = object()

def count(self, ptr=dummy):
    if ptr is dummy:
        ptr = self.head
    if ptr == None:
        return 0  # use an integer
    else:
        return 1 + self.count(ptr.next)

答案 1 :(得分:0)

您还可以将纯递归调用放在特定方法中,并使用它周围的包装器:

def count(self):
    def count_rec(ptr):
        if ptr == None:
            return 0
        else:
            return 1 + count_rec(ptr.next)
    return count_rec(self.head)

IMO,这比使用虚拟对象和/或默认参数更简洁(顺便说一下,在递归函数中指定默认参数通常是一个好的迹象,你应该考虑一个内部递归函数并从你的方法调用它正确的初始化)。