有这样的功能
def get_line_list(d, a=[]):
for i in d:
if type(i) != list:
a.append(i)
else:
get_line_list(i)
return a
print(get_line_list([1, 2, [True, False], ["Москва", "Уфа", [100, 101], ['True', [-2, -1]]], 7.89]))
第一个参数是一个多维列表,第二个参数是一个空列表,您需要将第一个元素中的所有元素移入其中,同时解包它们,以便列表最终是一维的。
问题:这里的递归函数在什么时候解包列表?这是怎么发生的?
第二个问题:递归这个话题需要操心多少,在实践中经常用到吗?这是某种黑暗,我想知道是否值得忍受和理解它?
当递归函数开始使用列表时,列表被“解包”。首先
for i in d
通过初始列表。然后,一旦它if type(i) != list
检测到该组件[True, False]
是一个列表,它就会进行递归调用并将for i in d
这个迷你列表“解包”到被调用的函数中。等等。我建议您在逐步调试器中亲自查看正在发生的事情,否则您会头晕目眩。这是我的另一个答案的链接,其中提到了关于调试器的最必要的事情(好吧,或者
print
使用它,它也在那里): 密码生成代码中的错误。请帮忙找原因,给个解释2. 递归用的不是很频繁,但是用过。有必要了解它,至少为了知道如何重新制定算法以摆脱它。在 Python 中,任何程序都可以在没有递归的情况下重写,但有时会很困难。没有它更好(代码运行得更快,通常堆栈上的负载更少),但它存在于算法中。
这是一个关于如何在基本情况下摆脱它的简单提示的链接: 递归问题的简单解决方案
顺便说一句,我真的不喜欢这个功能。一个有两个否定的条件,一个隐式参数传递,一般来说......但是如果你不从头开始重写所有东西,而只是清理现有的,那么我会这样做:
至于为什么需要递归,这是一个奇怪的问题。那么为什么要使用任何其他工具,即使是抽象的工具。很多时候,递归解决方案被证明是不言而喻的、优雅的和精巧的。我建议解决递归问题。这是我最喜欢的例子:编写一个函数,选择三个数字的平均值,即位于其他两个数字轴上的一个。尝试找出在哪里应用递归。