def recursion(level,param1,param2,...)
//递归终结条件
if level>MAX_LEVEL:
process_result
return
//处理当前层
process(level,data...)
//下探到下一层
self.recursion(level+1,p1,...);
//清理当前层
//reverse the current level status if needed
public void recur(int level,int param){
//递归终结条件
if(level>MAX_LEVEL){
return;
}
//处理当前层
process(level,param);
//下探到下一层
recur(level:level+1,newParam);
//清理当前层
//reverse the current level status if needed
}
思维要点:
解题思路:爬三阶楼梯期试就是爬一阶楼梯的方法之后加上2,或者就是爬两阶楼梯的方法,在最后跨上三
#找最近的重复子问题
#if else
#for while,recursion
#1:1
#2:2
#3:f(1)+f(2)
#mutual exclusive,complete exhaustive
#所有的分项都是完全互斥的且它们加到一起把所有的可能性包括了
#4:f(2)+f(3)
#f(n)=f(n-1)+f(n-2):Fibonacci数列
def clibStairs(n):
if(n<=2):return n
f1,f2,f3=1,2,3
for i in range(3,n+1):
f3=f1+f2
f1=f2
f2=f3
return f3
public List<String> generateParenthesis(int n)
{
_generate(0,2*n,"");
return null
}
//level开始位置,MAX最大数,s输出结果
private void _generate(int level,int max,String s){
//递归终止条件terminator
//当到达最大数时结束,并且简单输出结果
if(level>=MAX){
System.out.println(s);
return;
}
//process 当前逻辑
//current logic :left,right加左括号或者右括号
//String s1=s+"(";
//String s2=s+")"; 可化简
//drill down
_generate(level:level+1,max,s:s+"(");
_generate(level:level+1,max,s:s+")");
//reverse states
//都为局部变量不需要清除
}
//以上将所有情况都穷举了
//left随时加,只要不超标
//right 左个数>有个数
//但是只要满足这个判断条件的s才可以加入,所以改参数个数,分别记录left,right,n,s
//left随时加,只要不超标
//right 左个数>右个数
private List<String> result;
public List<String> generateParenthesis(int n){
result=new ArrayList<String>();
_generate(left:0,right:0,n,s:"");
return result;
}
private void _generate(int left,int right,int n,String s){
if(left==n&&right==n){
rsult.add(s);
return;
}
if(left<n)
_generate(left:left+1,right,n,s:s+"(");
if(left>right )
_generate(left,right:right+1,n,s:s+"(");