目录
参考资料:
基础知识:
1. 多项并列递归的执行流程
1). 最重要的:
2). 解释
简单问题分析
1). 简单程序举例
3. 总结
并列问题分析:
1. 问题引申
2.逻辑图演示
3. 上述分析总结(理论篇)
4. 一些特别的处理方式
1. n项递归、递推函数的读取/理解
2. 递归、递推函数理解举例(数学关系)
3.递归、递推函数理解举例(非数学关系:&|!)
4. 方法的执行顺序,上述分析
递归递推的基本理解https://blog.csdn.net/qq_23095607/article/details/125245890
通项公式的部分求解方法https://www.bilibili.com/video/BV1E44y1o7x8/?spm_id_from=333.337.search-card.all.click&vd_source=97411b9a8288d7869f5363f72b0d7613
传递至底 → 反弹后推
@Testpublic void test_02(){// 进行n到0 的遍历serachNum(3);}private void serachNum(int num){// 判断前输出System.out.println("判断前操作:"+num);if(num<0){System.out.println("该数值小于0");return;}//进行递归前操作System.out.println("递归前操作"+num);int num_1 = num-1;serachNum(num_1);//递归后操作System.out.println("递归后操作"+num);}
那么第一次向下递推到底的输出为:
递归函数前,由上至下执行操作,直到触底
触底后进行反弹,由下至上,执行递归函数的后续操作
那么这个函数的输出为:
判断前操作:3
递归前操作3
判断前操作:2
递归前操作2
判断前操作:1
递归前操作1
判断前操作:0
递归前操作0
判断前操作:-1
该数值小于0
递归后操作0
递归后操作1
递归后操作2
递归后操作3
那么画图可以表示为:
package com.example.demo.controller;import java.util.Arrays;/*** @program: demoForWeb* @description: 快排* @author: wjl* @create: 2023-02-14 00:47**/
public class QuickSort {public static void sort(int array[], int left, int right) {System.out.println(" 判断前:left:"+left+"======right:"+right+"======array:"+ Arrays.toString(array));int i, j;int pivot;if (left >= right) {System.out.println(" 判断中:left:" + left + "======right:" + right+"======array:"+ Arrays.toString(array));return;}System.out.println(" 判断后操作前:left:"+left+"======right:"+right+"======array:"+ Arrays.toString(array));i = left;j = right;pivot = array[i];while (i < j) {while (i < j && pivot <= array[j])j--;if (i < j)array[i++] = array[j];while (i < j && pivot > array[i])i++;if (i < j)array[j--] = array[i];}array[i] = pivot;System.out.println(" 操作后迭代前:left:"+left+"======right:"+right+"======array:"+ Arrays.toString(array));sort(array, left, i - 1);System.out.println("迭代①后迭代②前:left:"+left+"======right:"+right+"======array:"+ Arrays.toString(array));sort(array, i + 1, right);System.out.println(" 迭代②后:left:"+left+"======right:"+right+"======array:"+ Arrays.toString(array));}public static void quickSort(int array[]) {sort(array, 0, array.length - 1);}public static void main(String[] args) {int a[] = { 5, 7, 4, 8, 6, 1 };quickSort(a);for (int i = 0; i < a.length; i++) {System.out.print(a[i] + " ");}}
}
1)基本流程分析
以数组【5,7,4,8,6,1】为例:
2)分析注意事项
A. 首先在①之前,输出为:
判断前:left:0======right:5======array:[5, 7, 4, 8, 6, 1]
判断后操作前:left:0======right:5======array:[5, 7, 4, 8, 6, 1]
操作后迭代前:left:0======right:5======array:[1, 4, 5, 8, 6, 7]
B.进入①到达③之前,输出为:
判断前:left:0======right:1======array:[1, 4, 5, 8, 6, 7]
判断后操作前:left:0======right:1======array:[1, 4, 5, 8, 6, 7]
操作后迭代前:left:0======right:1======array:[1, 4, 5, 8, 6, 7]
C. 进入③,反弹前,输出为:
判断前:left:0======right:-1======array:[1, 4, 5, 8, 6, 7]
判断中:left:0======right:-1======array:[1, 4, 5, 8, 6, 7]
D. 反弹后,进入④前,输出为:
迭代①后迭代②前:left:0======right:1======array:[1, 4, 5, 8, 6, 7]
E. 进入④,反弹前,输出为:
判断前:left:1======right:1======array:[1, 4, 5, 8, 6, 7]
判断中:left:1======right:1======array:[1, 4, 5, 8, 6, 7]
F. 反弹后,进入②前,输出为:
迭代②后:left:0======right:1======array:[1, 4, 5, 8, 6, 7]
迭代①后迭代②前:left:0======right:5======array:[1, 4, 5, 8, 6, 7]
G. 以此类推,后续结果为:
②~⑤
判断前:left:3======right:5======array:[1, 4, 5, 8, 6, 7]
判断后操作前:left:3======right:5======array:[1, 4, 5, 8, 6, 7]
操作后迭代前:left:3======right:5======array:[1, 4, 5, 7, 6, 8]⑤~⑦
判断前:left:3======right:4======array:[1, 4, 5, 7, 6, 8]
判断后操作前:left:3======right:4======array:[1, 4, 5, 7, 6, 8]
操作后迭代前:left:3======right:4======array:[1, 4, 5, 6, 7, 8]⑦~反弹
判断前:left:3======right:3======array:[1, 4, 5, 6, 7, 8]
判断中:left:3======right:3======array:[1, 4, 5, 6, 7, 8]反弹~⑧
迭代①后迭代②前:left:3======right:4======array:[1, 4, 5, 6, 7, 8]⑧~反弹
判断前:left:5======right:4======array:[1, 4, 5, 6, 7, 8]
判断中:left:5======right:4======array:[1, 4, 5, 6, 7, 8]反弹~⑥
迭代②后:left:3======right:4======array:[1, 4, 5, 6, 7, 8]
迭代①后迭代②前:left:3======right:5======array:[1, 4, 5, 6, 7, 8]⑥~反弹
判断前:left:6======right:5======array:[1, 4, 5, 6, 7, 8]
判断中:left:6======right:5======array:[1, 4, 5, 6, 7, 8]反弹~结束
迭代②后:left:3======right:5======array:[1, 4, 5, 6, 7, 8]
迭代②后:left:0======right:5======array:[1, 4, 5, 6, 7, 8]
所以,递归、递推函数可以的比喻为一个小球,自右向左,经过一个满是孔洞的地面;
最上面孔洞最大,孔洞的大小随孔洞的深度递减;
大孔洞下面还有小孔洞;
触底反弹到离它最近的下一个孔洞,直至至最高层;
F(n)=F(n -1)+ F(n -2)(n ≥ 2,n ∈ N*) ;
F(1)= 1;
F(0)=1
综合总结(实践篇):
@Testpublic void A(){System.out.println("前100个斐波那契数列和为:" + function(100));}public int function(int num){if(num == 1||num == 2){return 1;}else if(num > 2){return function(num-1)+function(num-2);}else{System.out.println("error");return 0;}}
F(n)=F(n -1)+ F(n -2)(n ≥ 2,n ∈ N*) ;
F(2)= 1;
F(1)=1
数n对某方法的结果等于数n-1对该方法的结果与数n-2对该方法的结果
且
数2,数1对该方法的结果为1
F(array,left,right) = OP1 & F(array,left,i-1) & F(array,i+1,right)
终止条件:left>=right表示当左下标和右下标在同一个格子中,甚至更过分时,就会触发返回条件
因为终止条件,即递推到底条件有且只满足一次
输入一个数组,经过OP1(以该数组左下标对应的数值为参考,将比该数值小的置于左边,比该数值大的置于右边,参考数值下标为i),然后将i左边的数据在进行一次该操作,i右边的数据再进行一次操作,直到数据只剩一个甚至没有