分治+递归+回溯+动态递推

递归状态树

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.动态递归(动态递推)

 

原文地址:https://www.cnblogs.com/xiaoming521/p/14878942.html