我在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
非常感谢任何帮助。
答案 0 :(得分:6)
在Python中默认参数是不是在运行时评估的表达式。这些是在评估def
时评估的表达式。所以对于class
通常是第一次读取文件时。
结果,在那一刻,没有self
。 self
是一个参数。因此,仅当您调用函数时才可以使用。
您可以使用例如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,这比使用虚拟对象和/或默认参数更简洁(顺便说一下,在递归函数中指定默认参数通常是一个好的迹象,你应该考虑一个内部递归函数并从你的方法调用它正确的初始化)。