关于递归的思路

递归 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
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

larance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值