前言
迭代和递归是两种常见的「编程方法」,本文主要比较下这两种方法的异同。在刷leetcode时,还看到很多相关的术语:动态规划、回溯法、DFS、BFS、分治、自顶向下、自底向上… 快要傻傻分不清楚了,它们之间到底是什么关系呢?后面再出一篇文章梳理一下。
迭代
- 通过一个循环结构来重复执行一组命令,直到满足特定的条件为止。
- 核心思想:通过多次重复执行相同或类似的操作,最终解决问题;
- 常见的迭代语句有"for"循环或"while"循环。
以二叉树的前序遍历为例:
def preOrder_traverse(root: TreeNode):
# badcase
if not root:
return []
# 利用栈遍历
res = []
stack = [root]
# 迭代的标志“while”
while stack:
node = stack.pop()
res.append(node.val)
# 先压入右子树,再压入左子树,保证左子树先出栈
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
递归
- 解决问题的过程中调用自身,将问题分解成同类子问题来解决;
- 核心思想:分而治之
以二叉树的前序遍历为例:
def preOrder_traverse(root: TreeNode):
res = []
if not root:
return []
res.append(root.val)
# 递归的标志:自己调用自己
res.extend(preOrder_traverse(root.left))
res.extend(preOrder_traverse(root.right))
return res
对比
- 迭代:更直观,适合顺序性问题,
- 递归:代码简洁,但没有迭代好理解。