回溯
什么是递归
递归是一种非常高效、简洁的编码技巧,比如DFS深度优先搜索、前中后序二叉树等都是使用递归。
递归在代码中的表现方式是方法或者函数调用自身,调用的过程为递,返回为归。
基本上,所有递归问题都可以用地推公式来表示。如:
f(n) = f(n-1) + 1,其中f(1)=1
递归需要满足三个条件
一个问题的解可以分解为几个子问题的解。
这个问题和分解后的子问题,除了数据规模不同,求解思路完全一样。
存在递归终止条件。
写递归代码的方法
找到将大问题分解为小问题的规律。
写出地推公式。
找出终止条件。
将递推公式和终止条件翻译成代码。
优势 vs 弊端
优势
表达能力强,代码简洁
弊端
堆栈溢出
函数调用时,会将临时变量封装为栈帧压入内存,等函数执行完成返回时,才出栈。如果递归求解规模很大,调用层次很深,一直压入栈,就会有堆栈溢出风险。
可以通过限制递归调用最大深度来解决这个问题。
重复计算
可以通过一个数据结构来保存已经求解过的
f(K)
,从而避免重复计算。空间复杂度较高
函数调用耗时较多
递归代码改为非递归代码
递归代码都可以改为迭代循环的非递归写法。
Last updated
Was this helpful?