关于递归的思路

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

 

你可能感兴趣的:(数据结构与算法,PHP)