递归状态树
1.分治
def divide_conquer(problem,param1,param2,...): #recursion terminator 1.递归终止条件 if proble is None: print_result return #prepare data 2.处理当前逻辑 data = prepare_data(problem) subresult1 = split_problem(problem,data) #conquer subproblems 3.下探到下一层 subresult1 = self.divide_conquer(subproblems[0],p1,...) subresult2 = self.divide_conquer(subproblems[1],p1,...) subresult3 = self.divide_conquer(subproblems[2],p1,...) ... #process adn generate the final result 4. 组合中间结果返回 result = process_result(subresult1,subresult2,subresult3,...)
2.回溯
回溯法采用试错的思想,他尝试分布的去解决一个问题,在分布解决问题的过程中,当它通过尝试发现现有的分布答案不能得到有效的正确答案的时候,他将取消上一步甚至是上几步的计算,再通过其他的可能的分步解答再次尝试寻找问题的答案
回溯法通过最简单的递归方法来实现,在反复重复上述的步骤可能出现两种情况:
找到一个可能存在的正确的答案;
在尝试了所有可能的分步方法后宣告该问题没有答案
3.递归模板
本质:寻找重复性
模拟递归:手写递归树
递归代码模板 public void recur(int level,int param){ //terminator 递归终止条件 if(level > MAX_LEVEL){ //process result return ; } //processs current logic 加工当前逻辑 process(level,param); //drill down 下沉到下一层 recur(level:level+1,newParam); //restore current status 恢复当前层
4.动态递归(动态递推)