通过递归方法计算列表中的元素

时间:2017-10-24 17:06:40

标签: python recursion

我正在努力掌握递归。一般来说,我理解它的作用,但我在理解以下方法的工作原理时遇到了一些麻烦。

def count_numbers_in_list(list):
  if list == []:
    return 0
  return 1 + count_numbers_in_list(list[1:])

现在我得到list[1:]返回给定列表中除第一个之外的所有内容。

但我无法理解的是,我们永远不会在列表本身上调用类似的东西。所以这个函数运行得很好,但是对我来说这个函数返回一个无限循环也是有意义的。

我希望有人能够正确地向我解释这里发生了什么。

谢谢!

2 个答案:

答案 0 :(得分:0)

这种递归计数方法基本上是说"如果我的列表是空的,那就是我的基本情况。这里有0个元素。否则,我只能计算其中一个元素,然后我可以计算列表的其余部分。"

所以" 1 +"正在说"计算其中一个要素"。 " count_numbers_in_list(列表[1:])"正在说"计算除列表中第一个元素之外的所有内容。"

然后你只是把它想象成某种延迟执行,或者如果你熟悉它就是堆栈。说我有清单[1,2,3]。递归语句说"返回1加上你计算的任何计数([2,3])"。同样,[2,3]的答案是1加上[3]的答案。 3是1 + []的答案,我们的基本情况说[]的答案是0.所以[3]解析为1 + 0 = 1,并将其传递回[2,3]。解析为1 + 1 = 2,并且2被传递回[1,2,3]的结果。结果为1 + 2 = 3,这是你的最终答案。

答案 1 :(得分:0)

  

现在我知道 list [1:] 会返回给定列表中除第一个之外的所有内容。

实际上,您已经找到了解释为什么该功能完美运作的答案。

return 1 + count_numbers_in_list(list[1:])

每次执行递归时,count_numbers_in_list都会得到一个较短的列表,直到其中没有元素为止:

让我们打破这个局面。考虑您有以下列表:

lst = [1, 2, 3, 4]

count_numbers_in_list首先获得[1, 2, 3, 4]

  1. 0 + count_numbers_in_list([1, 2, 3, 4])
  2. (0 + (1 + count_numbers_in_list([2, 3, 4]))
  3. (1 + (1 + count_numbers_in_list([3, 4]))
  4. (2 + (1 + count_numbers_in_list([4]))
  5. (3 + (1 + count_numbers_in_list([])))
  6. (4 + (count_numbers_in_list([])))
  7. (4 + 0)
  8. 结果为4