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].
我处理问题的方式是:

  • 0元素是否为列表-否
  • 1元素是否为列表-否
  • 是2元素a吗 列表-是

    再次调用函数并再次执行测试

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


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

    您的方法是正确的,但是您不应该检查超过第一个元素的内容。一般来说,“纯”递归解决方案只需查看列表的“头”(第一个元素)和“尾”(
    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