我正在努力掌握递归。一般来说,我理解它的作用,但我在理解以下方法的工作原理时遇到了一些麻烦。
def count_numbers_in_list(list):
if list == []:
return 0
return 1 + count_numbers_in_list(list[1:])
现在我得到list[1:]
返回给定列表中除第一个之外的所有内容。
但我无法理解的是,我们永远不会在列表本身上调用类似的东西。所以这个函数运行得很好,但是对我来说这个函数返回一个无限循环也是有意义的。
我希望有人能够正确地向我解释这里发生了什么。
谢谢!
答案 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]
:
0 + count_numbers_in_list([1, 2, 3, 4])
(0 + (1 + count_numbers_in_list([2, 3, 4]))
(1 + (1 + count_numbers_in_list([3, 4]))
(2 + (1 + count_numbers_in_list([4]))
(3 + (1 + count_numbers_in_list([])))
(4 + (count_numbers_in_list([])))
(4 + 0)
结果为4
。