为了更好地理解递归

时间:2016-02-23 17:17:12

标签: python algorithm recursion

我正在尝试更好地学习递归,所以我一直在练习一些问题。

常见问题是将列表列表展平为单个列表。例如

[3,4,[1,2]] so the desired result will be [3,4,1,2].

我接近问题的方法是:

  1. 是0个元素列表 - 没有
  2. 是1个元素列表 - 没有
  3. 是2个元素a 列表 - 是的

    再次调用该函数并再次进行测试

  4. 我的基本情况是,如果元素不是列表,则返回。

    有更好的方法可以更好地理解递归吗?

3 个答案:

答案 0 :(得分:3)

您的方法是正确的方向,但您不应该检查超过第一个元素。一般来说 - “纯粹的”递归解决方案只需要查看列表的“头部”(第一个元素)和“尾部”(list[1:])。

像(像python一样的伪代码):

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:])

答案 1 :(得分:1)

你的例子肯定是有效的,但是你可能会对你的理解有点过于简单。我发现迷宫问题对我理解递归问题最有帮助。主要前言是有一个由两个不同值组成的2x2数组。一个值表示迷宫内的墙,另一个值表示空的空间。你的工作是使用递归遍历迷宫。这是一个示例问题和解决方案:

https://www.cs.bu.edu/teaching/alg/maze/

希望这会有所帮助!!

答案 2 :(得分:0)

你应该。

  1. 在调用函数之前创建一个新列表(已传递)。通话功能。
  2. 循环遍历旧的并查看列表的类型是否如此,然后调用函数递归。
  3. else将元素添加到传递列表中。
  4. 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