所以myListToPyList(lst):接受lst,一个MyList对象并返回一个包含相同数据的Python列表
def myListToPyList(lst):
return myListToPyListRec(lst.head)
这是我的帮手功能:
def myListToPyListRec(node):
if node == None:
return
else:
st1 = []
st1.append(node.data)
myListToPyListRec(node.next)
return st1
它无法正常工作。
现在,我的迭代解决方案正常运行:
def myListToPyList(lst):
"""
Takes a list and returns a python list containing
the same data
param; lst
return; list
"""
st1 = []
curr = lst.head
while curr != None:
st1.append(curr.data)
curr = curr.next
return st1
答案 0 :(得分:0)
while循环相当于尾递归,反之亦然。 (Python没有自动尾调用消除的一个原因是反之亦然'部分相当容易。)尾递归要求你添加一个累加器参数以在基本情况下返回。虽然我没有用于测试的链表,但我相信以下内容应该可行。 (如果没有,这很接近。)Python的默认参数使得帮助更容易或不必要。
def myListToPyListRec(node, py_list=[]):
if node
py_list.append(node.data)
return myListToPyListRec(node.next, py_list)
else:
return py_list
答案 1 :(得分:0)
您当前的递归代码不起作用,因为每次调用它时,它会创建一个新的空列表,向列表中添加一个值,然后递归(不传递列表)。这意味着当处理链接列表中的最后一项时,调用堆栈将具有N
个单元素Python列表(其中N
是列表节点的数量)。
相反,您应该在非递归包装函数中仅创建一次列表。然后将它传递给所有递归:
def myListToPyList(lst):
result_list = [] # create just one Python list object
myListToPyListRec(lst.head, result_list) # pass it to the recursive function
return result_list # return it after it has been filled
def myListToPyListRec(node, lst):
if node is not None # the base case is to do nothing (tested in reverse)
lst.append(node.data) # if node exists, append its data to lst
myListToPyListRec(node.next, lst) # then recurse on the next node
因为Python列表是可变的,所以我们不需要在递归调用中返回任何内容(默认情况下会返回None
,但我们会忽略它)。 result_list
中myListToPyList
引用的列表与lst
的每个递归调用中myListToPyListRec
引用的对象相同。只要递归函数使对象变异(例如使用append
)而不是重新绑定它,它们都会看到相同的东西。
请注意,Python中的递归效果不如迭代,因为函数调用比只更新几个变量有更多的开销。