当前位置: 首页 > news >正文

递归--数据结构--黑马

递归

总结一句话,上手直接多刷Leetcode,比看这个更有用。

定义

递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。

例如,单链表递归遍历的例子:

void f(Node node) {if (node == null) {return;}f(node.next);
}

说明:

  1. 自己调用自己,如果每个函数对应一个解决方案,自己调用自己意味着解决方案一样(有规律)。
  2. 每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无需继续递归。
  3. 内层函数调用(子集处理)完成,外层函数才能算调用完成。

例如,

// 假如链表是,1 -> 2 -> 3 -> null    
void f(Node node) {if (node == null) {return;}System.out.println("before: " + node.value);f(node.next);System.out.println("after: " + node.value);
}

根据递归的性质,从链表头节点开始遍历,打印第一个节点值 n o d e . v a l u e = 1 node.value=1 node.value=1 ,进入 f ( n o d e . n e x t ) f(node.next) f(node.next) 第二个节点不为空,打印第二个节点值 n o d e . v a l u e = 2 node.value=2 node.value=2 ,进入 f ( n o d e . n e x t ) f(node.next) f(node.next) 到第三个节点(不为null),打印第三个节点值 n o d e . v a l u e = 3 node.value=3 node.value=3 ,进入 f ( n o d e . n e x t ) f(node.next) f(node.next) ,因为当前节点为null,则进入 i f if if 语句,return返回,执行第三次 f f f 函数的输出语句,得到 n o d e . v a l u e = 3 node.value=3 node.value=3 ,然后执行第二次 f f f 函数的输出语句,得到 n o d e . v a l u e = 2 node.value=2 node.value=2 ,最后执行第一次 f f f 函数的输出语句,得到 n o d e . v a l u e = 1 node.value=1 node.value=1

使用伪代码执行流程如下,不考虑语法正确。

// 假如链表是,1 -> 2 -> 3 -> null   
void f(Node node = 1) {System.out.println("before: " + node.value);			// 1void f(Node node = 2) {System.out.println("before: " + node.value);		// 2void f(Node node = 3) {System.out.println("before: " + node.value);	// 3void f(Node node = null) {if (node == null) {return;}}System.out.println("after: " + node.value);		// 3}System.out.println("after: " + node.value);			// 2}System.out.println("after: " + node.value);				// 1
}

简单应用

例1 - 阶乘

用递归方法求阶乘

  • 阶乘定义: n ! = 1 ⋅ 2 ⋅ 3 ⋯ ( n − 2 ) ⋅ ( n − 1 ) ⋅ n n!=1·2·3 \cdots(n-2)·(n-1)·n n!=123(n2)(n1)n ,其中 n n n 为自然数, 0 ! = 1 0!=1 0!=1
  • 递推关系

f ( n ) = { 1 , n = 1 n ∗ f ( n − 1 ) , n > 1 f(n) = \begin{cases} 1, & n=1 \\ n*f(n-1), & n>1 \end{cases} f(n)={1,nf(n1),n=1n>1

public class Factorial {public int f(int n) {if (n == 1) {return 1;}return n * f(n - 1);}
}

例2 - 递归反向打印字符串

public class ReversePrintString{public static void f(int n, String str) {if (n == str.length()) {		// 当n索引等于字符串长度,returnreturn;}f(n + 1, str);System.out.println(str.charAt(n));}public static void main(String[] args) {f(0, "abcd");}
}

例3 - 递归版二分查找

public class BinarySearch {public static int search(int[] a, int target) {return f(a, target, 0, a.length - 1);}// 实现递归的方法private static int f (int[] a, int target, int i, int j) {if (i > j) {// 递归终止条件,未找到return -1;}int m = (i + j) >>> 1;if (target < a[m]) {return f(a, target, i, m - 1);} else if (target > a[m]) {return f(a, target, m + 1, j);} else {return m;}}}

例4 - 递归版冒泡排序

public class BubbleSort{public static void sort (int[] a) {bubble(a, a.length - 1);}private static void bubble(int[] a, int j) {if (j == 0) {return;}for(int i = 0; i < j; i++) {if (a[i] > a[i + 1]) {swap(a, i, i + 1);}}bubble(a, j - 1);}public static void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}
}
递归版冒泡排序改进
public class BubbleSort{public static void sort (int[] a) {bubble(a, a.length - 1);}private static void bubble(int[] a, int j) {if (j == 0) {return;}int x = 0;		// 使用变量x记录下次排序的右边界for(int i = 0; i < j; i++) {if (a[i] > a[i + 1]) {swap(a, i, i + 1);x = i;}}bubble(a, x);}public static void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}
}

或者不使用递归,直接使用循环,如下

public class BubbleSort{public static void sort (int[] a) {int j = a.length - 1;while (true) {int x = 0;		// 使用变量x记录下次排序的右边界for(int i = 0; i < j; i++) {if (a[i] > a[i + 1]) {swap(a, i, i + 1);x = i;}}j = x;if (j == 0) {break;}}}public static void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}public static void main(String[] args) {int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1};sort(arr);System.out.println(Arrays.toString(arr));}
}

例5 - 递归版插入排序

public class InsertionSort{public static void sort(int[] a) {insertion(a, 1);}public static void insertion(int[] a, int low) {if (low == a.length) {return;}int t = a[low];int i = low - 1;while (i >= 0 && a[i] > t) {a[i + 1] = a[i];i--;}if (low - 1 != i) {a[i + 1] = t;}insertion(a, low + 1);}}

不使用递归,直接使用循环,如下

public class InsertionSort{public static void sort(int[] a) {for(int low = 1; low < a.length; low++) {int t = a[low];			// 插入的值int i = low - 1;		// 已排序的右边界while (i >= 0 && a[i] > t) {a[i + 1] = a[i];i--;}// 找到插入点,找到比插入值小的索引if (low - 1 != i) {a[i + 1] = t;}}}
}

例6 - 斐波那契数列

递推关系

f ( n ) = { 0 , n = 0 1 n = 1 f ( n − 1 ) + f ( n − 2 ) , n > 1 f(n) =\begin{cases}0,& n=0\\ 1 & n=1 \\ f(n - 1)+f(n-2), & n>1 \end{cases} f(n)= 0,1f(n1)+f(n2),n=0n=1n>1

public class Fibonacci {public static int f(int n) {if (n == 0) {return 0;}if (n == 1) {return 1;}return f(n - 1) + f(n - 2);}
}

改进算法如下,使用空间换时间

public class Fibonacci {public static int fibonacci (int n) {int[] cache = new int[n + 1];Arrays.fill(cache, -1);cache[0] = 1;cache[1] = 1;return f(n, cache);}public static int f (int n, int[] cache) {if (cache[n] != -1) {return cache[n];} cache[n] = f(n - 1) + f(n - 2);return cache[n];}
}

递归时间复杂度计算

Master theorem 主定理

若有递归式
T ( n ) = a T ( n b + f ( n ) ) T(n)=aT(\frac{n}{b} + f(n)) T(n)=aT(bn+f(n))
其中

  • T ( n ) T(n) T(n) 是问题运行的时间, n n n 是数据规模
  • a 是子问题个数
  • T ( n b ) T(\frac{n}{b}) T(bn) 子问题运行的时间,每个子问题被拆成原问题数据规模的 n b \frac{n}{b} bn
  • f ( n ) f(n) f(n) 是除去递归外运行的时间。

x = l o g b a x=log_{b}a x=logba ,即 x = l o g 子问题缩小倍数 x=log_{子问题缩小倍数} x=log子问题缩小倍数 子问题个数

那么
T ( n ) = { Θ ( n x ) f ( n ) = O ( n c ) 并且 c < x Θ ( n x l o g n ) f ( n ) = Θ ( n x ) Θ ( n c ) f ( n ) = Ω ( n c ) 并且 c > x T(n) = \begin{cases} \Theta(n^x) & f(n)=O(n^c)并且c<x\\ \Theta(n^xlogn) & f(n)=\Theta(n^x)\\ \Theta(n^c) & f(n)=\Omega(n^c)并且c>x \end{cases} T(n)= Θ(nx)Θ(nxlogn)Θ(nc)f(n)=O(nc)并且c<xf(n)=Θ(nx)f(n)=Ω(nc)并且c>x

例 1

T ( n ) = 2 T ( n 2 + n 4 ) T(n)=2T(\frac{n}{2} + n^4) T(n)=2T(2n+n4)

  • x = 1 < 4 x=1<4 x=1<4 ,由后者决定时间复杂度 Θ ( n 4 ) \Theta(n^4) Θ(n4)
例 2

T ( n ) = T ( 7 n 10 + n 4 ) T(n)=T(\frac{7n}{10} + n^4) T(n)=T(107n+n4)

  • x = 0 < 1 x=0<1 x=0<1 ,由后者决定时间复杂度 Θ ( n ) \Theta(n) Θ(n)
例 3

T ( n ) = 16 T ( n 4 + n 2 ) T(n)=16T(\frac{n}{4} + n^2) T(n)=16T(4n+n2)

  • x = 2 = 2 x=2=2 x=2=2 ,由前者决定时间复杂度 Θ ( n 2 l o g n ) \Theta(n^2logn) Θ(n2logn)
例 4 - 递归-二分查找
public static int f(int[] a, int target, int i, int j) {int m = (i + j) >>> 1;if (i > j) {return - 1;}if (target < a[m]) {return f(a, target, i, m - 1);} else if (target > a[m]) {return f(a, target, m + 1, j);} else {return m;}
}
  • 子问题个数 a = 1 a=1 a=1
  • 子问题数据规模缩小倍数 b = 2 b = 2 b=2
  • 除递归外执行的计算是常数级 c = 0 c=0 c=0

T ( n ) = T ( n 2 + n 0 ) T(n)=T(\frac{n}{2} + n^0) T(n)=T(2n+n0)

  • 因为 x = 0 = 0 x=0=0 x=0=0 ,时间复杂度为 Θ ( l o g n ) \Theta(logn) Θ(logn)
例 5 - 递归-归并排序
// 伪代码
void split(B[], i, j, A[]) {if (j - i <= 1) {return;}m = (i + j) >>> 1;// 递归split(B[], i, m - 1, A[]);split(B[], m + 1, j, A[]);// 合并merge(B, i, m, j, A);
}
  • 子问题个数 a = 2 a=2 a=2
  • 子问题数据规模缩减倍数 b = 2 b=2 b=2
  • 除递归外,主要时间花在合并上,用 f ( n ) = n f(n)=n f(n)=n 表示;

T ( n ) = 2 T ( n 2 + n ) T(n)=2T(\frac{n}{2} + n) T(n)=2T(2n+n)

  • 因为 x = 1 = 1 x=1=1 x=1=1 ,时间复杂度为 Θ ( n l o g n ) \Theta(nlogn) Θ(nlogn)

展开定理

例 1 - 递归求和
long sum(long n) {if (n == 1) {return 1;}return sum(n - 1) + n;
}

T ( n ) = T ( n − 1 ) + c T(n)=T(n - 1) + c T(n)=T(n1)+c T ( 1 ) = c T(1)=c T(1)=c

如下展开过程

T ( n ) = T ( n − 2 ) + c + c T(n)=T(n - 2) + c + c T(n)=T(n2)+c+c

T ( n ) = T ( n − 3 ) + c + c + c T(n)=T(n - 3) + c + c + c T(n)=T(n3)+c+c+c

⋯ \cdots

T ( n ) = T ( 1 ) + ( n − 1 ) c = n c T(n)=T(1)+(n-1)c=nc T(n)=T(1)+(n1)c=nc

时间复杂度: O ( n ) O(n) O(n)

例 2 - 递归冒泡排序
void bubble(int[] a, int high) {if (high == 0) {return;}for(int i = 0; i < high; i++) {if (a[i] > a[i + 1]) {// 交换swap(a, i, i + 1);}}return bubble(a, high - 1);
}

T ( n ) = T ( n − 1 ) + n T(n)=T(n - 1) + n T(n)=T(n1)+n T ( 1 ) = c T(1)=c T(1)=c

如下展开过程

T ( n ) = T ( n − 2 ) + ( n − 1 ) + n T(n)=T(n - 2) + (n - 1) + n T(n)=T(n2)+(n1)+n

T ( n ) = T ( n − 3 ) + ( n − 1 ) + ( n − 2 ) + n T(n)=T(n - 3) + (n - 1) + (n - 2) + n T(n)=T(n3)+(n1)+(n2)+n

⋯ \cdots

T ( n ) = T ( 1 ) + 2 + ⋯ + n = T ( 1 ) + ( n − 1 ) n + 2 2 = c + n 2 2 + n 2 − 1 T(n)=T(1)+2+\cdots+n=T(1)+(n - 1)\frac{n+2}{2}=c+\frac{n^2}{2}+\frac{n}{2}-1 T(n)=T(1)+2++n=T(1)+(n1)2n+2=c+2n2+2n1

时间复杂度: O ( n 2 ) O(n^2) O(n2)

推导公式网址

推导公式网址
在这里插入图片描述

多路递归

例 1-汉诺塔

public class HanoiTower{static LinkedList<Integer> a = new LinkedList<>();static LinkedList<Integer> b = new LinkedList<>();static LinkedList<Integer> c = new LinkedList<>();static void init(int n) {for (int i = n; i >= 1; i--) {a.addLast(i);}}// n 为圆盘个数// a, 源// b, 借// c, 目标static void move(int n, LinkedList<Integer> a, LinkedList<Integer> b, LinkedList<Integer> c) {if (n == 0) {return;}move(n - 1, a, c, b);			// 借助c盘,将a盘的n-1个移到b盘c.addLast(a.removeLast());		// 将a盘中的最后一个移到c盘move(n - 1, b, a, c);			// 借助a盘,将b盘的n-1个移动到c盘}public void print(){System.out.println("------------");System.out.println(a);System.out.println(b);System.out.println(c);}public static void main(String[] args) {// init(3);// print();			// a=[3, 2, 1], b=[], c=[]// b.addLast(a.removeLast());		// print();			// a=[3, 2], b=[1], c[]init(3);print();move(3, a, b, c);print();}
}

​ 使用展开定理,或者使用公式网址,子问题个数是2,数据规模比原来减少1, T ( n ) = 2 T ( n − 1 ) + c T(n)=2T(n-1)+c T(n)=2T(n1)+c ,中间操作(将a中的最后一个移动到c)看作常数 c c c
在这里插入图片描述

例 2-杨辉三角

public class PascalTriangle {// 返回某个位置的值public static int element(int i, int j) {if (i == 0 || i == j) {return 1;}return element(i - 1, j - 1) + element(i - 1, j);}// 打印空格public void printSpace(int n, int i) {int num = (n - 1 - i) * 2;for(int j = 0; j < num; j++) {System.out.print(" ");}}// 打印前n行的杨辉三角public static void print(int n) {for(int i = 0; i < n; i++) {printSpace(n, i);for(int j = 0; j <= i; j++) {System.out.printf("-%4d", element(i, j)); 	// 左对齐,并占4位}System.out.print();		// 换行处理}}public static void main(String[] args) {print(5);}}

改进杨辉三角,使用二维数组记录已经计算过的每项元素

public class PascalTriangle {// 返回某个位置的值public static int element(int[][] triangle, int i, int j) {if (triangle[i][j] > 0) {return triangle[i][j];}if (i == 0 || i == j) {triangle[i][j] = 1;return 1;}triangle[i][j] = element(triangle, i - 1, j - 1) + element(triangle, i - 1, j)return triangle[i][j];}  // 打印前n行的杨辉三角public static void print(int n) {// 创建二维数组int[][] triangle = new int[n][];for(int i = 0; i < n; i++) {// 初始化每行i+1个元素triangle[i] = new int[i + 1];for(int j = 0; j <= i; j++) {System.out.printf("-%4d", element(triangle, i, j)); 	// 左对齐,并占4位}System.out.print();		// 换行处理}}public static void main(String[] args) {print(5);}}

改进杨辉三角,使用一维数组

public class PascalTriangle { public static void createRow(int[] row, int i) {if (i == 0) {row[0] = 1;return;}for(int j = i; j > 0; j--) {row[j] = row[j] + row[j - 1];}}// 打印前n行的杨辉三角public static void print(int n) {// 初始一维数组int[] triangle = new int[n];for(int i = 0; i < n; i++) {// 计算createRow(row, i);for(int j = 0; j <= i; j++) {System.out.printf("-%4d", element(triangle, i, j)); 	// 左对齐,并占4位}System.out.print();		// 换行处理}}public static void main(String[] args) {print(5);}}

相关文章:

递归--数据结构--黑马

递归 总结一句话&#xff0c;上手直接多刷Leetcode&#xff0c;比看这个更有用。 定义 递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 例如&#xff0c;单链表递归遍历的例子&#xff1a; void f(Node node) {if (node null) {retu…...

【3.1】贪心算法-解分发饼干

一、题目 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c; 每个孩子最多只能给一块饼干 。 对每个孩子i&#xff0c;都有一个 胃口值 g[i] &#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干j&#xff0c;都有一个…...

解决 Error running ‘Application‘: Command line is too long.

一、项目场景&#xff1a; 运行刚拉取下来的项目代码&#xff0c;出现下面问题描述的错误提示。 二、问题描述 Error running Application: Command line is too long. Shorten command line for Application or also for Spring Boot default configuration? 翻译翻译&…...

衡量与归因将是Netflix程序化广告业务的首要任务

作者&#xff1a;刀客doc 8月20日&#xff0c;Netflix宣布今年上半年&#xff0c;品牌的招商收入同比增长了150%&#xff0c;广告主来自旅游、汽车、零售商、快餐和大众快消等行业。这一消息提振了资本市场对Netflix广告业务的信心&#xff0c;8月20日收盘创下每股 698.54 美元…...

关于如何在已有qt项目中添加该项目的单元测试工程

关于如何在已有qt项目中添加该项目的单元测试工程 新建一个子目录工程&#xff0c;把已有项目作为子工程添加进去&#xff0c;然后新建单元测试工程也作为子工程添加进去。单元测试项目要独立于实际项目工程&#xff0c;确保去掉测试项目后&#xff0c;实际项目仍可以正常运行…...

深度剖析数字媒体产业链的无限潜力与创新生态

在当今信息爆炸的时代&#xff0c;数字媒体产业链正以势不可挡的姿态展现出其令人瞩目的无限潜力与创新生态。 数字媒体的发展潜力简直无可限量。从在线视频的爆发式增长&#xff0c;到虚拟现实和增强现实技术带来的沉浸式体验&#xff0c;再到社交媒体平台上丰富多彩的内容创…...

集团数字化转型方案(十二)

集团数字化转型方案致力于通过构建一个集成化的数字平台&#xff0c;全面应用大数据分析、人工智能、云计算和物联网等前沿技术&#xff0c;推动业务流程、管理模式和决策机制的全面升级。该方案将从业务流程的数字化改造开始&#xff0c;优化资源配置&#xff0c;提升运营效率…...

Andrid异步更新UI:Handler(二)深入了解:Message你真的会创建?它是如何子线程和主线程通知?

目录 为什么会有HandlerHandler的原理&#xff0c;以及对象讲解主线程的loop在哪里&#xff0c;为什么主线程loop没有阻塞呢&#xff1f;Looper如何保证唯一Handler为什么会引发内存泄漏呢&#xff1f;Message应该如何创建它&#xff1f; 一、为什么会有Handler 线程分为主线…...

2025计算机毕设50条小众好做的Java题目【计算机毕设选题推荐】

随着2025年的到来&#xff0c;计算机专业的学生们又迎来了毕业设计的关键时刻。对于大多数学生来说&#xff0c;选择一个合适的毕业设计题目往往是一项艰巨的任务。本文旨在为那些正在为毕业设计题目烦恼的同学们提供一些灵感和建议&#xff0c;特别是针对使用Java技术栈的同学…...

day06_算法训练

一. Stream流 1.1 Stream流概述 概念: jdk1.8以后提供的新的API, 主要用于批量操作数据(集合的另外一种操作方式),代码非常简洁 流式处理思想: 2.2 Stream对象获取 1.单列集合的Stream流对象获取 2.双列集合的Stream流对象获取 3.数组的Stream流对象获取 4.散装数据的St…...

@SpringBootTest单元测试中报错:无法自动装配,找不到 ‘XXX‘ 类型的 Bean

一开始照着网上教程讲Springboot原理中的代码来copy写的↓ import com.google.gson.Gson; import com.itheima.pojo.Result; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.cont…...

nodemon学习(一)简介、安装、配置、使用

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前&#xff0c;我们开发一个node后端服务时&#xff0c;每次更改文件&#xff0c;均需重启一下&#xff0c;服务才能生效。这使我们的开发效率降低了很多。nodemon的出现&#xff0c;可以…...

【Qt从摄像头视频中获取数据】

有时候需要在视频上画图&#xff0c;所以需要能获取到每一帧视频数据。 以前从视频文件或视频流中得到帧&#xff0c;一般都是使用qt ffmpeg或qt vlc。 qt对显示处理视频大体有以下方法&#xff1a; QMediaPlayer QVideoWidget 这种方法只适合简单的显示视频功能&#xff…...

视频截取中的UI小组件

引言 视频截取在社交类 APP 中十分常见。有了上传视频的功能&#xff0c;就不可避免地需要提供截取和编辑的选项。如果我们过度依赖第三方库&#xff0c;项目的代码可能会变得异常臃肿&#xff0c;因为这些库往往包含许多我们用不到的功能&#xff0c;而且它们的 UI 样式和功能…...

java设计模式--结构型模式

结构性模式&#xff1a;适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09; 充当两个不兼容接口之间的桥梁&#xff0c;属于结构型设计模式。目的是将一个类的接口转换为另一个接口&am…...

消息中间件:Kafka消息丢失与堆积问题分析与解决方案

消息中间件&#xff1a;Kafka消息丢失与堆积问题分析与解决方案 Kafka作为分布式消息系统&#xff0c;广泛应用于实时数据流处理、大数据分析等领域。然而&#xff0c;在实际应用中&#xff0c;Kafka可能会面临消息丢失和消息堆积的问题&#xff0c;这些问题如果得不到有效处理…...

mac终端代理配置指南

终端代理配置指南 在 macOS 中&#xff0c;你可以通过几种不同的方法来配置终端代理。这里介绍两种常见的设置方式&#xff1a;使用 alias 和 shell 函数。 方法 1&#xff1a;使用 Alias 配置代理 打开终端配置文件 默认情况下&#xff0c;macOS 终端使用的是 zsh。如果你的系…...

mbedTLS生成客户端,服务端密钥及CA证书

1. mbedTLS源码&#xff1a;https://github.com/Mbed-TLS/mbedtls.git 2. 生成步骤&#xff1a; 2.1 编译上述源码 2.2 生成CA私钥和自签名证书&#xff1a; 进入编译的build目录&#xff0c;比如&#xff1a;/mbedtls-development/build# 2.2.1生成CA私钥 执行下面的命令&…...

如何有效应对突发技术故障:以网易云音乐为例

引言 在互联网行业&#xff0c;任何一个在线服务都可能遭遇突发的技术故障。这些故障不仅影响用户体验&#xff0c;还可能对公司的品牌形象造成损害。因此&#xff0c;如何快速响应并高效解决这些问题成为了每一个开发团队的重要课题。本文将以网易云音乐在2024年8月19日下午遭…...

上传文件到github仓库

REF: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 已有repository&#xff0c;往仓库里更新内容 点击gitlab里的clone 在git bash中使用git clone&#xff0c;这个时候会将网上的仓库下载到本地&#xff0c;你可以把想要更新的内容直接拖到仓库里 …...

clip-path实现图片边角的裁剪

img {clip-path: polygon(0 7px,7px 0,calc(100% - 20px) 0,100% 20px,100% 100%,16px 100%,0 calc(100% - 16px));}每一个逗号隔开的就是路径坐标 左上角的两个点 0 7px &#xff0c;7px 0 右上角 calc(100% - 20px) 0,100% 20px 相当于通过这些点练成的线的圈起来的部分就是剩…...

【C++ Primer Plus习题】2.7

问题: 解答: #include <iostream> using namespace std;void print(int hour, int minute) {cout << "Time:" << hour << ":" << minute << endl; }int main() {int hour0;int minute 0;cout << "请输入…...

uboot中 fastboot udp 协议分析

注&#xff1a; 1. 本文所分析的fastboot源码不是android下的源码&#xff0c;而是恩智浦芯片厂商在IMX6UL芯片的uboot源码中自己实现的源码&#xff0c;二者不同&#xff0c;请读者注意区分。一些图片是网上找到的&#xff0c;出处不好注明&#xff0c;请见谅。 2. 分析fastbo…...

redis hash类型的命令

1.hset 格式&#xff1a; hset key field value [field value ...]&#xff08;value是字符串&#xff09; 返回值&#xff1a;设置成功的键值对的个数 2.hget&#xff1a;获取键值对 格式:hget key field 3.hexists&#xff1a;判断hash中是否存在指定 格式&#xff1a;…...

【OpenCV】 中使用 Lucas-Kanade 光流进行对象跟踪和路径映射

文章目录 一、说明二、什么是Lucas-Kanade 方法三、Lucas-Kanade 原理四、代码实现4.1 第 1 步&#xff1a;用户在第一帧绘制一个矩形4.2 第 2 步&#xff1a;从图像中提取关键点4.3 第 3 步&#xff1a;跟踪每一帧的关键点 一、说明 本文针对基于光流法的目标追踪进行叙述&am…...

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…...

前端宝典十一:前端工程化稳定性方案

一、工程化体系介绍 1、什么是前端工程化 前端工程化 前端 软件工程&#xff1b;前端工程化 将工程方法系统化地应用到前端开发中&#xff1b;前端工程化 系统、严谨、可量化的方法开发、运营和维护前端应用程序&#xff1b;前端工程化 基于业务诉求&#xff0c;梳理出最…...

yum 数据源的切换

本来准备安装一个ntp 服务器时间进行同步&#xff0c;但是使用yum install ntp -y 但是却失败了 原因是yum自带的镜像源不能用了&#xff0c;所以要想使用yum 多功能只能切换yum 对应的镜像源了 如果你的服务商是可以使用wget命令的&#xff1a; wget -O /etc/yum.repos.d/Ce…...

MySQL入门学习-命令行工具.mysqlbinlog

MySQL 命令行工具mysqlbinlog用于处理二进制日志文件。 一、关于mysqlbinlog工具的详细介绍&#xff1a; 1、命令行工具mysqlbinlog的特点和使用方法&#xff1a; - 特点&#xff1a; - 可以解析和查看二进制日志文件的内容。 - 支持多种输出格式&#xff0c;如文本、SQ…...

WARNING XXX is not overriding the create method in batch

WARNING XXX is not overriding the create method in batch api.modeldef create(self, vals):quvals[name]youqu self.env[crm.qu].sudo().search([(name, , qu),(shi_id,,vals[shi_id])])if len(youqu)>0:raise UserError(_("该区名已存在&#xff0c;无需再填加…...