Python 递归计算链表中的节点数

Python 递归计算链表中的节点数,python,recursion,linked-list,Python,Recursion,Linked List,问题:返回链接列表中的节点数 我最近在学习递归。我知道如何使用迭代来解决这个问题,但我坚持使用递归的方法。下面是我的代码,它总是返回1,而不是链表的实际计数。我想不出这个问题,希望有人能帮我。我怎样才能解决这个问题 def numberOfNodes(head): total_node = 0 return __helper(total_node, head) def __helper(total_node, head): if not head: return

问题:返回链接列表中的节点数

我最近在学习递归。我知道如何使用迭代来解决这个问题,但我坚持使用递归的方法。下面是我的代码,它总是返回1,而不是链表的实际计数。我想不出这个问题,希望有人能帮我。我怎样才能解决这个问题

def numberOfNodes(head):
   total_node = 0
   return __helper(total_node, head)


def __helper(total_node, head):
   if not head:
      return total_node += 1
   __helper(total_node, head.next)
   return total_node

对于这类事情来说,递归是一个糟糕的选择(增加了开销,并有可能因为没有好的理由而破坏调用堆栈),但是如果您确实出于教育目的使用它,那么最简单的方法是将总数向上传递到调用堆栈,而不是向下传递:

def linked_list_len(head):
   return linked_list_len(head.next) + 1 if head else 0
基本上,在
头部
节点存在的地方,每帧添加1,然后使用下一个节点再次调用该函数。基本情况是
head
None

在某些提供的语言中,您可以避免子帧递归调用返回的变量发生
+1
工作。这允许编译器或解释器将递归转换为循环,避免堆栈溢出。代码如下所示(与您的方法类似,不同之处在于在递归调用中添加了
+1
):


但是Python,所以您可以用上面所示的更简单的方法编写它。

只需要基本的调试。问问你自己什么时候加1到总数中?为了学习递归,亲自调试这个问题将教会你很多东西,而不仅仅是寻找一个你自己没有想到的解决方案。尝试一步一步地调试,并注意
total\u node
的值以及代码所在的位置。我知道现在发生了什么。我只是将total\u node更改为列表,然后返回len(total\u node)。创建一个列表只是为了计算它的长度,这是一个解决问题的糟糕方法。这就像用航天飞机烤西葫芦一样。请使用整数。是的,对这样的简单问题练习递归很好,现在您可以将列表解决方案转换为使用整数。请记住,
total_node
是调用帧的局部值,而不是引用,因此
total_node+=1
只更改该帧的局部值。很可能,列表版本之所以有效,是因为它是对原始对象的引用。如果total确实(正确地)向下传递到堆栈,则可以利用尾部递归。您是否可以显示用于此的代码?我还没有看到Python中的TCO,我认为它不支持它。
def linked_list_len(head, total=0):
    return linked_list_len(head.next, total + 1) if head else total