擅长:python、mysql、java
<p>posted函数在运行到第一个不包含列表的自下而上列表元素时返回/退出-这会阻止遍历递归的所有进一步分支。例如:</p>
<pre><code>print( f([1, [[2, 'a', [3, 'b', [4, 'c']]], ['a','b']], (3, 4)]) )
# gives: [4, 'c']
print( f([1, ['X','Y'], [[2, 'a', [3, 'b', [4, 'c']]], ['a','b']], (3, 4)]) )
# gives: ['X','Y']
</code></pre>
<p>造成这种行为的关键点是线路</p>
<pre><code>result = []
</code></pre>
<p>这会将函数每次调用的结果列表重置为空列表。这样,递归调用链只返回一个项。你知道吗</p>
<p>顺便说一下,下面的函数f实现了你所期望的,不是吗?你知道吗</p>
<pre><code>def f(L, result):
for e in L:
if type(e) != list:
result.append(e)
else:
f(e, result)
result=[]; f([1, [[2, 'a', [3, 'b', [4, 'c']]], ['a','b']], (3, 4)], result) print( result )
# gives: [1, 2, 'a', 3, 'b', 4, 'c', 'a', 'b', (3, 4)]
result=[]; f( [1, ['X','Y'], [[2, 'a', [3, 'b', [4, 'c']]], ['a','b']], (3, 4)], result); print( result )
# gives: [1, 'X', 'Y', 2, 'a', 3, 'b', 4, 'c', 'a', 'b', (3, 4)]
</code></pre>
<p>注意:(3,4)元组不是列表。。。你知道吗</p>
<p>上面的函数f从一个列表中收集项目,如果这些项目本身不是一个列表。在特殊情况下,当列表中的项是一个列表时,函数将调用自身从该列表中收集项。通过这种方式,从层次结构中的所有元素都被收集起来,无论需要挖掘多深。这就是递归的美妙之处——一个函数调用它自己就可以实现访问树上所有分支及其叶子的“魔力”:</p>