【问题标题】:Count elements in list via a recursive method通过递归方法计算列表中的元素
【发布时间】:2017-11-04 00:14:23
【问题描述】:

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

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

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

但我无法理解的是,我们从来没有在列表本身上调用类似 - 1 的东西。所以这个函数完美地工作,但对我来说这个函数返回一个无限循环也是有意义的。

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

谢谢!

【问题讨论】:

  • 您应该确定list[1:] 的作用。
  • I get that list[1:] returns everything from the given list except the first.你有答案。
  • 不过,如果您有问题,请使用print 语句进行调试。你应该很容易得到它。
  • 将print(list) 放在def 语句之后会有帮助吗?然后通过使用简短列表调用该函数来执行该函数。顺便说一下从不 使用诸如list 之类的关键字作为变量名。这样做最终会咬到你。
  • 感谢您的快速回复!意味着很多;)

标签: python recursion


【解决方案1】:

现在我知道 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)

结果是4。

【讨论】:

  • 对!我也使用了print 方法来准确地向我展示函数中发生了什么。但是当它最终变成一个空的[] 时,我们会说:if list == []: return 0。即使我们在第 3 行调用 return 0,这个函数如何仍然返回 4(在你的情况下)?
  • 如果您查看每个步骤,您会看到每次执行递归时返回的值都会递增,因为您将 1 添加到来自先前递归的值。
【解决方案2】:

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

所以“1+”表示“计算其中一个元素”。 “count_numbers_in_list(list[1:])”是说“计算除列表中第一个元素之外的所有内容。”

然后,您只需将其视为某种延迟执行,或者如果您熟悉的话,可以将其视为堆栈。假设我有列表 [1, 2, 3]。递归语句说“返回 1 加上你计算出的 count([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,这就是你的最终答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多