递归的实现、特性以及思维要点

简单的用python来看
在这里插入图片描述

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    
        }

思维要点:

  1. 不要人肉进行递归(最大的误区)
    刚开始学的话,在纸上将递归所进行的状态,即递归的状态树画出来,当然进阶的主动抛弃人肉递归,直接看函数本身开始写即可
  2. 找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
    写的程序只包括if else然后for和while loop然后第三部分就是递归调用,有一些复杂的逻辑代码带式有很强的重复性
  3. 数学归纳法思维
    最开始最简单的条件是成立的,比如n=1,n=2,且能够证明当n成立的时候,,n+1也成立简单举例就是放鞭炮,第一个鞭炮燃了的话,同时保证前一个鞭炮炸的时候后一个鞭炮一定炸

实战习题

爬楼梯问题 在这里插入图片描述

解题思路:爬三阶楼梯期试就是爬一阶楼梯的方法之后加上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

括号生成

在这里插入图片描述
java实现

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+"(");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值