什么是递归、迭代(类比解释)

本文详细解析了二叉树中序遍历的递归实现,通过实例展示了如何确定函数定义、状态转换式和边界条件。同时,以老和尚讲故事的递归场景生动讲解了递归概念,并将其与迭代方法对比,以助于理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归三板斧:

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年的故事讲完了

这次你没有打人。

迭代解释:

迭代就是把这次的输出作为下一次的输入

参考链接:什么是递归? - 知乎

递归和迭代_键盘上的钢琴师_v5的博客-CSDN博客_迭代和递归的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值