Python 为了更好地理解递归
我正在尝试更好地学习递归,所以我一直在练习一些问题 一个常见的问题是将列表列表展平为单个列表。比如说Python 为了更好地理解递归,python,algorithm,recursion,Python,Algorithm,Recursion,我正在尝试更好地学习递归,所以我一直在练习一些问题 一个常见的问题是将列表列表展平为单个列表。比如说 [3,4,[1,2]] so the desired result will be [3,4,1,2]. 我处理问题的方式是: 0元素是否为列表-否 1元素是否为列表-否 是2元素a吗 列表-是 再次调用函数并再次执行测试 我的基本情况是,如果元素不是列表,则返回 有更好的方法更好地理解递归吗?您的方法是正确的,但是您不应该检查超过第一个元素的内容。一般来说,“纯”递归解决方案只需查看列表的“
[3,4,[1,2]] so the desired result will be [3,4,1,2].
我处理问题的方式是:
有更好的方法更好地理解递归吗?您的方法是正确的,但是您不应该检查超过第一个元素的内容。一般来说,“纯”递归解决方案只需查看列表的“头”(第一个元素)和“尾”(
list[1://code>)
类似(类似python的伪代码):
你应该
在调用函数之前创建一个新列表(已通过)。调用函数
循环检查旧的列表类型,如果是,则调用递归函数
否则将元素添加到已传递的列表中
你的例子当然是一个有效的例子,但它可能有点太简单了,你无法完全理解。我发现迷宫问题对我理解递归问题最有帮助。主要前言是有一个2x2数组,由两个不同的值组成。一个值表示迷宫内的墙,另一个值表示空白空间。您的工作是使用递归遍历迷宫。下面是一个问题和解决方案示例:
希望这有帮助 这对我来说似乎很好。将空的可变类型传递给函数通常是个坏主意。如果它被用作位置参数,为什么要传递它呢?只需让函数创建一个并返回它。如果将用作默认参数,则会得到一些意想不到的结果,因为每次调用函数时都不会重新创建列表。它在程序启动时创建一次,该函数的每次后续运行都将返回相同的列表,其中的所有元素都是前一次运行时的元素。正如你所说的那样,那会引起一个问题。空列表允许答案随着每次添加而增长,并传递给递归调用。如果未通过,则列表必须一起被污染,这也是可以的。如果要更改值,则应返回新值,而不是隐式更改函数内的参数。在使用这个函数之前必须创建一个新的空列表是一个奇怪的要求。让我来看看这个。谢谢你的建议
def flatten(l):
if len(l) == 0:
return []
if isinstance(l[0], list):
left = flatten(l[0])
else:
left = [l[0]]
return left + flatten(l[1:])
aList = [3,4,[1,2]]
def flatten(inList,outList):
for elem in inList:
if isinstance(elem,list):
flatten(elem,outList)
else:
outList.append(elem)
bList = list()
flatten(aList,bList)
print bList