递归 Python 代码模板
def recursion(level,param1,param2,...):
# recursion terminator 递归终结条件
if level >MAX_LEVEL:
process_result
return
#process login in current level 处理当前层逻辑
process(level,data,...)
#drill down 下探到下一层
self.recursion(level+1,p1,...)
#reverse the current level status if needed 清理当前层
Java 代码模板
public void recur(int level,int param){
//terminator
if(level>max_level){
//process result
return
}
//process current login
process(level,param)
//drill down
recur(level:level+1, newParam)
//restore current status
}
思维要点
1、不要人肉进行递归
2、找到最近最简方法,将其拆解成可重复的问题,(重复子问题)
3、数学归纳法思维
递归四件套
递归终止条件,防止陷入死循环
递归内部处理逻辑
递归进下一层
递归清除,比如清楚一些无用的变量,分情况是否需要
题目 https://leetcode-cn.com/problems/generate-parentheses/
class Solution {
/**
* @param Integer $n
* @return String[]
*/
private $result = [];
function generateParenthesis($n) {
$this->generate(0,0,$n,"");
return $this->result;
}
function generate($left,$right,$max, $s){
// terminator 左右括号都与所需数量相等,递归结束
if($left == $max && $right == $max){
$this->result[] = $s;
return ;
}
// processor
// drill down
// 左括号数量仍不够,继续递归
if($left < $max) $this->generate($left+1,$right,$max, $s."(");
// 右括号数量小于左括号数量才能递归,此处做了剪枝,减少了递归数量
if($right < $left) $this->generate($left,$right+1,$max, $s.")");
// clean
}
}