递归三板斧:
1、确定函数的定义
2、确定状态转换式
3、确定边界
以二叉树的中序遍历为例:
- class Solution(object):
- def inorderTraversal(self, root):
- """
- :type root: TreeNode
- :rtype: List[int]
- """
- res = []
- def dfs(root):
- if not root:
- return
- # 按照 左-打印-右的方式遍历
- dfs(root.left)
- res.append(root.val)
- dfs(root.right)
- dfs(root)
- return res
1、确定函数的定义:
dfs(root) 含义是 以root为根节点的二叉树的中序遍历
2、确定状态转换式:
根据中序遍历的顺序(左根右),得到当前左子树为根节点的中序遍历(root.left),才能对当前节点进行操作,即 res.append(root.val), 然后再对右子树进行中序遍历
3、确定边界:
显然二叉树的边界为遍历到的节点为叶子节点。
递归解释1:

递归解释2:

递归解释3:
有个朋友过来给你讲故事。
从前有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
--从前有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
----从前有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
------从前有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
这样下去有无数层
你终于受不了讲故事的,怒气值满了一脚把对方踢飞了,这叫做Stack Overflow,毕竟你的时间资源和耐心是有限的。
对方养好了伤之后,又来给你讲故事,这次他为了防止不会挨打,他决定有办法终止这个轮回,于是他把“从前”改为了固定年份,并且他事先声明:只讲到1513年,就终止。故事变成了:
1444年时,会有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
--1445年时,会有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
----1446年时,会有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
你耐着性子听到了后面,正想打人时:
1511年时,会有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
--1512年时,会有座山,山上有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事讲的是
----1513年时,会有座山,但新教出现了,山上的庙改成了小教堂,
--1512年的故事讲完了
1511年的故事讲完了
你非常高兴,他一把拉住你,说还没完:
--------1510年的故事讲完了
------1509年的故事讲完了
----1508年的故事讲完了
--1507年的故事讲完了
你快发疯了,终于等到
1444年的故事讲完了
这次你没有打人。
迭代解释:
迭代就是把这次的输出作为下一次的输入
参考链接:什么是递归? - 知乎