迭代到递归

时间:2014-10-25 18:41:20

标签: python-3.x

所以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 

2 个答案:

答案 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_listmyListToPyList引用的列表与lst的每个递归调用中myListToPyListRec引用的对象相同。只要递归函数使对象变异(例如使用append)而不是重新绑定它,它们都会看到相同的东西。

请注意,Python中的递归效果不如迭代,因为函数调用比只更新几个变量有更多的开销。