递归、分治

递归 - 循环:通过函数体来进行循环

举例:

1.从前有个⼭山,
2.⼭山⾥里里有个庙,
3.庙⾥里里有个和尚讲故事:

  1.从前有个⼭山,
  2.⼭山⾥里里有个庙,
  3.庙⾥里里有个和尚讲故事:

      ......

递归代码模板

Class recursion(level, param1, param2, ...)    
    //递归终止条件
    if(level >MAX_LEVEL){
        print_result
        return
    }
    //当前层的逻辑
    process_data(level, data...)
    //开始递归下一层
    recursion(level + 1 ,p1...)
    //如果需要,请反转当前级别状态
    revers_state(level)

分治 - Divde & Conquer

分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在计算机科学中,分治法就是运用分治思想的一种很重要的算法。分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等。

使用分治的基本情况:

1.问题缩小到一定规模容易解决

2.分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质

3.分解而成的小问题在解决之后要可以合并

4.子问题是相互独立的,即子问题之间没有公共的子问题

分治代码模板:

Class divide_conquer(problem,param1,param2...){
    //递归终止
    if(probem is none){
        print_result
        return
    }
    //预处理数据
	data = prepare_data(problem);
	subproblems = split_problem(problem,data)
	

    //解决子问题
	sub_result1 = divide_conquer(subprolems[0],p1...)
	sub_result2 = divide_conquer(subproblems[1],p1...)
	sub_result3 = divi_conquer(subproblem[2],p1...)
}

猜你喜欢

转载自blog.csdn.net/qq_38765867/article/details/88360034