递归1——递归入门
目录
1.递归
2.递归的基本题目
2.1.题目一——P5739 【深基7.例7】计算阶乘 - 洛谷 | 计算机科学教育新生态
2.2.题目二——B2064 斐波那契数列 - 洛谷 | 计算机科学教育新生态
2.3.题目三——B2142 求 1+2+3+...+N 的值 - 洛谷 | 计算机科学教育新生态
2.4.题目四——B2144 阿克曼(Ackermann)函数 - 洛谷 | 计算机科学教育新生态
2.5.题目五——B2145 digit 函数 - 洛谷 | 计算机科学教育新生态
2.6.题目六——B2147 求 f(x,n) - 洛谷 | 计算机科学教育新生态
2.7.题目七——B2148 再求 f(x,n) - 洛谷 | 计算机科学教育新生态
2.8.题目八——B2143 进制转换 - 洛谷 | 计算机科学教育新生态
3.二叉树里面的递归
3.1.题目一——100. 相同的树 - 力扣(LeetCode)
3.2.题目二——101. 对称二叉树 - 力扣(LeetCode)
3.3.题目三 ——572. 另一棵树的子树 - 力扣(LeetCode)
3.4.题目四——144. 二叉树的前序遍历 - 力扣(LeetCode)
3.5.题目五——94. 二叉树的中序遍历 - 力扣(LeetCode)
3.6.题目六——145. 二叉树的后序遍历 - 力扣(LeetCode)
从这章,我们先讲递归,然后讲搜索,然后再讲回溯算法。
1.递归
1.1.递归的基本知识
- 什么是递归
我只讲3个东西来讲递归
- 二叉树的遍历
- 快排:先选一个基准元素,将数组分成3部分,然后让左边部分进行排序,再让右边部分排序
- 归并:取数组中点,让数组分成两部分,然后先让左边部分先排序,再让右边部分排序,然后合并两个数组
- 为什么会用到递归?
本质就是这个问题可以拆分为多个相同的子问题,子问题又可以拆分成相同的子问题。
这个就像是数学的F(x,y)通用的。
- 如何理解递归?
1.画递归展开的细节图
2.二叉树的题目
3.宏观看待递归
- 不要在意递归的细节展开图
- 把递归的函数当成一个黑盒
- 相信这个黑盒一定能完成任务
- 此外,我们一定要设置递归结束的地方
我们只关心当前的这个任务能不能顺利完成,如果当前可以完全,那么递归一定也可以(注意要加一个结束条件),就像下面这样子
- 如何写好一个递归
- 我们先找到一个相同的子问题 -> 这个决定了函数头的设计
- 我们只关心某一个子问题是怎么解决的 ->这个决定函数体的书写
- 注意一下递归函数的出口——>就是什么时候不能递归的时候,就让函数返回
1.2.递归和深度优先遍历(DFS)
其实我们发现这两货的执行逻辑是一模一样啊!!
1.3.递归和循环/迭代
递归本质是完成重复的子任务,循环也是完成重复的子任务
- 递归算法
优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
- 循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
- 递归算法和循环算法总结:
1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理。
2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
3.递归和循环两者完全可以互换。如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。(例如:求阶乘的递归实现与循环实现。)
2.递归的基本题目
2.1.题目一——P5739 【深基7.例7】计算阶乘 - 洛谷 | 计算机科学教育新生态
这题其实非常简单
#include<iostream>
using namespace std;int fact(int n)
{if(n==1)return 1;elsereturn fact(n-1)*n;
}int main()
{int a;cin>>a;cout<<fact(a)<<endl;
}
2.2.题目二——B2064 斐波那契数列 - 洛谷 | 计算机科学教育新生态
这题还是很简单的
#include<iostream>
using namespace std;int res(int n)
{if(n==1||n==2)return 1;elsereturn res(n-1)+res(n-2);
}int main()
{int n;cin>>n;while(n--){int m;cin>>m;cout<<res(m)<<endl;}
}
2.3.题目三——B2142 求 1+2+3+...+N 的值 - 洛谷 | 计算机科学教育新生态
很简单的题目,不必多说
#include<iostream>
using namespace std;int res(int n)
{if(n==1)return 1;elsereturn res(n-1)+n;
}int main()
{int m;cin>>m;cout<<res(m)<<endl;
}
2.4.题目四——B2144 阿克曼(Ackermann)函数 - 洛谷 | 计算机科学教育新生态
这个理解题目很重要啊
#include<iostream>
using namespace std;int akm(int m,int n)
{if(m==0)return n+1;else if(m>0&&n==0)return akm(m-1,1);elsereturn akm(m-1,akm(m,n-1));
}int main()
{int m,n;cin>>m>>n;cout<<akm(m,n)<<endl;
}
2.5.题目五——B2145 digit 函数 - 洛谷 | 计算机科学教育新生态
这里就上了一点难度了啊,怎么做呢?
我们知道
- n/10就能减去n最右边那个数字
- n%10就能获得最右边那个数字
而我们题目要的是右边第k个数字,说明我们最后的结果一定是n%10出来的。
所以终止条件就是当k==1的时候,直接返回n%10即可。
这样子我们就很容易写出下面这个代码
#include<iostream>
using namespace std;int digit(int n,int k)
{if(k==1)return n%10;elsereturn digit(n/10,k-1);
}int main()
{int n,k;cin>>n>>k;cout<<digit(n,k)<<endl;
}
2.6.题目六——B2147 求 f(x,n) - 洛谷 | 计算机科学教育新生态
这个还是非常简单的
#include<iostream>
#include<cmath>
using namespace std;float f(float x,int n)
{if(n==1)return sqrt(1+x);elsereturn sqrt(n+f(x,n-1));
}int main()
{float x;int n;cin>>x>>n;printf("%.2f\n", f(x,n));
}
2.7.题目七——B2148 再求 f(x,n) - 洛谷 | 计算机科学教育新生态
这个明眼人就看出来了!!
#include<bits/stdc++.h>
using namespace std;float f(float x,int n)
{if(n==1)return x/(1+x);elsereturn x/(n+f(x,n-1));
}int main()
{float x;int n;cin>>x>>n;printf("%.2f\n",f(x,n));
}
2.8.题目八——B2143 进制转换 - 洛谷 | 计算机科学教育新生态
这题上强度了啊!!!
首先我们得知道,这个题目的最大进制是16进制,所以我们必须得能表示16进制,那我们怎么快速的表示一个16进制的数字呢?
我们可以使用一个string,然后下标和这个数字一一对应。
其中2——16进制的所有表达方式都能在上面这个s里面找到。
接着,我们仔细看下面这个步骤
我们发现是不是好像有规律啊?
最后递归得到的就是最高位的数字,我们完全可以让它先出来。
看完之后,有没有通透一点,就是我们完全可以写出下面这个代码
#include <iostream>using namespace std;string s = "0123456789ABCDEF";void x_to_m(int x, int m){if (x >= m)x_to_m(x / m, m);cout << s[x % m];}int main(){int x = 0;int m = 0;cin >> x >> m;x_to_m(x, m);return 0;}
3.二叉树里面的递归
理解递归,上面的那些题目可不够,必须来看一下二叉树的递归。
3.1.题目一——100. 相同的树 - 力扣(LeetCode)
判断两棵二叉树是否相同,也可以将其分解为子问题:
- 比较两棵树的根是否相同。
- 比较两根的左子树是否相同。
- 比较两根的右子树是否相同。
代码:
class Solution {
public:// 判断两棵二叉树是否相同bool isSameTree(TreeNode* p, TreeNode* q) {if (p == NULL && q == NULL) // 两棵树均为空,则相同return true;if (p == NULL || q == NULL) // 两棵树中只有一棵树为空,则不相同return false;if (p->val != q->val) // 两棵树根的值不同,则不相同return false;return isSameTree(p->left, q->left) && isSameTree(p->right,q->right); // 两棵树的左子树相同并且右子树相同,则这两棵树相同}
};
3.2.题目二——101. 对称二叉树 - 力扣(LeetCode)
对称二叉树,这里所说的对称是指镜像对称:
要判断某二叉树是否是对称二叉树,则判断其根结点的左子树和右子树是否是镜像对称即可。
因为是镜像对称,所以左子树的遍历方式和右子树的遍历方式是不同的,准确来说,左子树和右子树的遍历是反方向进行的。
如下图:
图中红蓝轨迹同时进行,同时结束。
- 若在遍历过程中发现镜像对称的某两个结点值不同,则无需继续遍历,此时已经可以判断该树不是对称二叉树
- 只有当红蓝轨迹成功遍历完毕后,才能断定该树是对称二叉树。
我们很快就能写出代码
class Solution {
public:// 判断镜像位置是否相等bool travel(TreeNode* left, TreeNode* right) {if (left == NULL && right == NULL) // 红蓝轨迹同时遍历到NULL,函数返回return true;if (left == NULL ||right ==NULL) // 红蓝指针中,一个为NULL,另一个不为NULL,即镜像不相等return false;if (left->val != right->val) // 红蓝指针指向的结点值不同,即镜像不相等return false;// 子问题:左子树遍历顺序:先左后右,右子树遍历顺序:先右后左。若两次遍历均成功,则是对称二叉树return travel(left->left, right->right) &&travel(left->right, right->left);}bool isSymmetric(TreeNode* root) {if (root == NULL) // 空树是对称二叉树return true;return travel(root->left, root->right); // 判断镜像位置是否相等}
};
3.3.题目三 ——572. 另一棵树的子树 - 力扣(LeetCode)
思路:
依次判断以 root 中某一个结点为根的子树是否与subRoot相同。
class Solution {
public:// 比较以root和subRoot为根结点的两棵树是否相等bool Compare(TreeNode* root, TreeNode* subRoot) {if (root == NULL && subRoot == NULL) // 均为空树,相等return true;if (root == NULL || subRoot == NULL) // 一个为空另一个不为空,不相等return false;if (root->val != subRoot->val) // 结点的值不同,不相等return false;// 比较两棵树的子结点return Compare(root->left, subRoot->left) &&Compare(root->right, subRoot->right);}// 另一个树的子树bool isSubtree(TreeNode* root, TreeNode* subRoot) {if (root == NULL) // 空树,不可能是与subRoot相同(subRoot非空)return false;if (Compare(root,subRoot)) // 以root和subRoot为根,开始比较两棵树是否相同return true;// 判断root的左孩子和右孩子中是否有某一棵子树与subRoot相同return isSubtree(root->left, subRoot) ||isSubtree(root->right, subRoot);}
};
3.4.题目四——144. 二叉树的前序遍历 - 力扣(LeetCode)
二叉树的前序遍历不知道是什么?自己去这里看看:链式二叉树的基本操作1-CSDN博客
class Solution {
public:// 前序遍历的递归函数// 参数ret用于存储遍历的结果,root是当前遍历到的节点void preorder(vector<int>& ret, TreeNode* root){// 如果当前节点为空,直接返回,不执行任何操作if(root == NULL)return; // 将当前节点的值添加到结果集ret中ret.push_back(root->val);// 递归遍历左子树preorder(ret, root->left);// 递归遍历右子树preorder(ret, root->right);}vector<int> preorderTraversal(TreeNode* root) {// 创建一个向量ret,用于存储遍历的结果vector<int> ret; // 调用递归函数preorder进行前序遍历,并将结果存储在ret中preorder(ret, root);// 返回存储遍历结果的向量return ret;}
};
3.5.题目五——94. 二叉树的中序遍历 - 力扣(LeetCode)
这题非常简单啊,我不想过多赘述啊!
class Solution {
public:// 中序遍历的递归函数// 参数ret用于存储遍历的结果,root是当前遍历到的节点void inorder(vector<int>& ret, TreeNode* root){// 如果当前节点为空,直接返回,不执行任何操作if(root == NULL)return; // 递归遍历左子树inorder(ret, root->left);// 将当前节点的值添加到结果集ret中// 此时,左子树的所有节点值都已经被添加到ret中了ret.push_back(root->val);// 递归遍历右子树// 此时,当前节点的值也已经被添加到ret中了inorder(ret, root->right);}vector<int> inorderTraversal(TreeNode* root) {// 创建一个向量ret,用于存储遍历的结果vector<int> ret; // 调用递归函数inorder进行中序遍历,并将结果存储在ret中inorder(ret, root);// 返回存储遍历结果的向量return ret;}
};
3.6.题目六——145. 二叉树的后序遍历 - 力扣(LeetCode)
class Solution {
public:// 后序遍历的递归函数// 参数ret用于存储遍历的结果,root是当前遍历到的节点void postorder(vector<int>& ret, TreeNode* root){// 如果当前节点为空,直接返回,不执行任何操作if(root == NULL)return; // 递归遍历左子树postorder(ret, root->left); // 递归遍历右子树postorder(ret, root->right);// 将当前节点的值添加到结果集ret中// 此时,左子树和右子树的所有节点值都已经被添加到ret中了ret.push_back(root->val);}vector<int> postorderTraversal(TreeNode* root) {// 创建一个向量ret,用于存储遍历的结果vector<int> ret; // 调用递归函数postorder进行后序遍历,并将结果存储在ret中postorder(ret, root);// 返回存储遍历结果的向量return ret;}
};
4.递归必刷题
4.1.题目一——面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)
我知道大家可能看不懂题目,我们看一个例子就好
这样子应该理解了吧。
但是我们这道题为什么可以使用递归来解决?
首先我们得明白,如何解决这个汉诺塔解决?
我们可以先从最简单的情况考虑:
假设n=1,只有⼀个盘⼦,很简单,直接把它从A中拿出来,移到C上;
如果n=2呢?
我们最先要做的就是想法设法的将大盘子放到C上面去,这时候我们就要借助B了,因为⼩盘⼦必须时刻都在⼤盘⼦上⾯,共需要3步(为 了⽅便叙述,记A中的盘⼦从上到下为1号,2号):
- a. 1号盘⼦放到B上;
- b. 2号盘⼦放到C上;
- c. 1号盘⼦放到C上。
⾄此,C中的盘⼦从上到下为1号,2号。
我们仔细观察就会发现
如果n=3呢?
我们还是先想办法将大盘子放到C上面去。
这是我们需要⽤到n=2时的策略,将A上⾯的两个盘⼦挪到B上,再将最⼤的盘 ⼦挪到C上,最后将B上的⼩盘⼦挪到C上就完成了所有步骤。
例如n=3时如下图: A B C 因为A中最后处理的是最⼤的盘⼦,所以在移动过程中不存在⼤盘⼦在⼩盘⼦上⾯的情况。
有没有发现这个过程里面
这样子能不能看出规律来啊!!重复子问题,我是已经看出来了!!
我们直接写代码就好。
class Solution
{
public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {// 调用深度优先搜索函数,参数包括三个柱子(a, b, c)和盘子数量(a.size())dfs(a, b, c, a.size());}// 深度优先搜索函数,用于递归地解决汉诺塔问题void dfs(vector<int>& a, vector<int>& b, vector<int>& c, int n){// 基本情况:如果只有一个盘子,直接将其从柱子a移动到柱子cif(n == 1){c.push_back(a.back()); // 将柱子a的最后一个盘子移动到柱子ca.pop_back(); // 从柱子a移除这个盘子return;}// 递归步骤1:将n-1个盘子从柱子a通过柱子c移动到柱子bdfs(a, c, b, n - 1);// 当前步骤:将第n个盘子(最大的盘子)从柱子a移动到柱子cc.push_back(a.back()); // 将柱子a的最后一个盘子移动到柱子ca.pop_back(); // 从柱子a移除这个盘子// 递归步骤2:将n-1个盘子从柱子b通过柱子a移动到柱子cdfs(b, a, c, n - 1);}
};
4.2.题目二——21. 合并两个有序链表 - 力扣(LeetCode)
我们这道题目其实之前已经做过的,但是我们今天要使用递归的方式来解决这个问题。
我们使用递归就得找到重复出现的子问题。
我们发现,我们可以先对比两个链表的第一个结点,看看哪个结点小,就先把这个结点放进我们的新链表里面,然后接着重复上面的这个步骤。
接下来我们就要思考下面三个问题
重复子问题就是合并两个有序链表,函数头就是传进去一个链表指针,返回新的链表指针
我们的主要步骤就是比大小
- 如果第一个链表的第一个结点的值小于第二个链表的第一个结点的值,就让第一个链表的第一个结点当新链表的第一个结点,然后让第一个链表的第2个结点和第二个链表的第1个比较。
- 如果第一个链表的第一个结点的值大于等于第二个链表的第一个结点的值,就让第二个链表的第一个结点当新链表的第一个结点,然后让第二个链表的第2个结点和第一个链表的第1个比较。
递归的出口
- 就是一条链表为空的时候,返回另外一条链表。
class Solution
{public:// 定义一个函数,用于合并两个已排序的链表ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {// 如果第一个链表为空,则直接返回第二个链表if(l1 == nullptr) return l2;// 如果第二个链表为空,则直接返回第一个链表if(l2 == nullptr) return l1;// 比较两个链表当前节点的值// 如果第一个链表的当前节点值小于或等于第二个链表的当前节点值if(l1->val <= l2->val){// 递归调用mergeTwoLists函数,传入第一个链表的下一个节点和第二个链表// 将返回的结果设置为第一个链表的当前节点的下一个节点l1->next = mergeTwoLists(l1->next, l2);// 返回第一个链表的当前节点作为合并后链表的头节点(因为l1的值较小或相等)return l1;}else{// 否则,如果第二个链表的当前节点值小于第一个链表的当前节点值// 递归调用mergeTwoLists函数,传入第一个链表和第二个链表的下一个节点// 将返回的结果设置为第二个链表的当前节点的下一个节点l2->next = mergeTwoLists(l1, l2->next);// 返回第二个链表的当前节点作为合并后链表的头节点(因为l2的值较小)return l2;}}
};
其实,我们只需要看递归的某一步骤——比较两个结点的值
我们的目的是返回一个头指针(因为题目需要头指针)。
所以这个递归就是找谁是头指针的问题!!!。
所以我们可以仔细看看,假设两个链表各剩下一个结点了,这个时候我们只需要判断这两个结点是否存在,如果其中一个不存在,就返回另外一个来当头结点,
如果都存在,则进行比较它们的值,谁小就先让它当后面序列的头指针,然后返回这个结点即可。
这样子想有没有更容易理解一点。
4.3.题目三—— 206. 反转链表 - 力扣(LeetCode)
这里从两个视角来看待这个问题
- 宏观视角来完成(我们直接看递归的最后一步)
就是我先让当前结点的下面一个结点先进行逆置,这样子一直递归,就会是下面这个情况
这个时候我们只需要像下面这样子做即可
总结起来就两步
- 先让当前结点的后面的链表先逆置,并且把新的头结点返回
- 让当前结点添加到逆置后的链表后面
什么时候不需要逆置了?
- 链表为空或者只有1个结点
class Solution
{public:ListNode* reverseList(ListNode* head) {// 如果链表为空(head为nullptr)或者只有一个节点(head->next为nullptr),则直接返回headif(head == nullptr || head->next == nullptr) return head;// 递归调用reverseList函数,传入head的下一个节点,目的是反转head之后的链表// newHead此时是反转后链表的头节点ListNode* newHead = reverseList(head->next);// 将当前节点的下一个节点的next指针指向当前节点,实现局部反转// 这一步是在递归返回的过程中执行的,确保了每次递归返回时,当前节点都被正确地插入到反转后的链表尾部之后head->next->next = head;// 将当前节点的next指针置为nullptr,断开当前节点与原来链表的连接// 这一步是必须的,否则会出现环或者多个节点指向原链表的后续节点head->next = nullptr;// 返回新的头节点return newHead;}
};
4.4.题目四——24. 两两交换链表中的节点 - 力扣(LeetCode)
这题我们怎么思考呢?
我们还是直接看最后一步,
就是假设链表后面所有结点都已经交换好了,交换好后都返回新的头结点。
就剩现在两个结点需要交换了,这个时候,这个时候我们只需要将第二个结点的next指针指向第一个结点,第一个结点的next指针指向新的头结点,然后我们再更新一下头结点。
我们很容易就写出下面这个代码
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head==nullptr||head->next==nullptr)return head;ListNode*newhead=swapPairs(head->next->next);ListNode*right=head->next;head->next->next=head;head->next=newhead;newhead=right;return newhead;}
};
4.5.题目五——50. Pow(x, n) - 力扣(LeetCode)
我们很快就能写出下面这个
class Solution {
public:double myPow(double x, int n) {if(n==1)return x;elsereturn x*myPow(x,n-1);}
};
但是它说我栈溢出了!!!
我们就可以先求n
相关文章:
递归1——递归入门
目录 1.递归 2.递归的基本题目 2.1.题目一——P5739 【深基7.例7】计算阶乘 - 洛谷 | 计算机科学教育新生态 2.2.题目二——B2064 斐波那契数列 - 洛谷 | 计算机科学教育新生态 2.3.题目三——B2142 求 123...N 的值 - 洛谷 | 计算机科学教育新生态 2.4.题目四——B2144…...
XuperChain核心流程
04-XuperChain核心流程 0 XuperChain架构图 核心框架 Xuper Chain主要由 Xuper Core 这个核心引擎来构建。Xuper Core 分为三个部分: 基础组件:日志、存储、监控等关键组件,以及密码学库等基本组件。 核心组件:包括共识、合约、账…...
2024.12.2工作复盘
1.今天学了什么? 简单的写了一篇博客,是关于参数校验的问题,参数校验,一个是前后端校验到底一不一致,一个是绕过前端校验,看后台的逻辑到底能不能校验住。 2.今天解决了什么问题? 3.今天完成…...
关于Vscode配置Unity环境时的一些报错问题(持续更新)
第一种报错: 下载net请求超时(一般都会超时很正常的) 实际时并不需要解决,它对你的项目毫无影响 第二种报错: .net版本不匹配 解决:(由于造成问题不一样,所以建议都尝试一次&…...
微信小程序——文档下载功能分享(含代码)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
长短期记忆网络 (LSTM) 简介
文章目录 一、说明二、传统 RNN 的问题三、为什么梯度消失?四、长短期记忆网络简介五、忘记门六、Update Gate (Input Gate)七、Output Gate八、数学上的内存九、从 LSTM 到 Transformer十、总结 一、说明 机器学习取得进步的领域之一是自然语言处理。对于用于机器…...
【电子通识】USB Type-C线缆为什么有的用到E-Marker芯片
USB Type-C接口具备数据传输、充电(基于USB PD协议)和音频视频传输能力。但是,上述功能都有强弱之别,并因此衍生出了无数种规格的USB Type-C线缆。 如下所示直接搜索就可以看到,虽然都是Type-C接口,但存在很多不同种类的线缆规格。 以数据传输为例,USB Type-C可选USB2.0…...
【故障处理系列--移动云云盘根目录在线扩容】
移动云云盘根目录扩容 **目的:**测试harbor仓库服务器的根目录能否在线扩容 1、移动云控制台系统盘扩容 这里以我自己的虚拟机演示 2、查看分区的文件类型 3、安装growpart工具 rootgitlab-cli:~# apt install cloud-guest-utils -y rootgitlab-cli:~# apt ins…...
混沌工程/混沌测试/云原生测试/云平台测试
背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …...
CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……
CloudQuery 社区 11 月新版本来啦!本月版本依旧是 CUG(CloudQuery 用户组)尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表;在流程模块引入了“审批人组”概念。此外,在 SQL 编辑器、连接管理等模块都涉及…...
【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程
IntelliJ IDEA(以下简称 IDEA)是一款功能强大的集成开发环境,广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven,并创建一个 Maven Java 工程,快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …...
c语言结构体
c语言结构体 1. 结构体的定义 在C语言中,结构体是一种用户自定义的数据类型,它允许你将不同类型的数据组合成一个单一的实体。结构体的定义以struct关键字开头,后面跟着结构体标签(可以省略,但为了方便后续引用&#…...
洛谷二分题
P1024 [NOIP2001 提高组] 一元三次方程求解 题目描述 有形如:𝑎𝑥3𝑏𝑥2𝑐𝑥𝑑0ax3bx2cxd0 这样的一个一元三次方程。给出该方程中各项的系数(𝑎,ᵄ…...
vue3的项目目录和关键文件
注意换插件 vue2的是 Vetur ;vue3的是volar 这里注意volar插件已更名为Vue - Official vite.config.js 放跟vite配置相关的内容 区别于vue2;vue2是vue.config.js;vue2是基于webpack的,vue3是基于vite的 main.js import { creat…...
rabbitmq原理及命令
目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…...
洛谷 P1308 [NOIP2011 普及组] 统计单词数 C语言
题目: https://www.luogu.com.cn/problem/P1308 复制Markdown 展开 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现…...
vue基础之5:vue数据代理、事件处理、事件修饰符、键盘事件
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
RK3568平台开发系列讲解(PWM篇)sysyfs 操作 pwm 原理讲解
🚀返回专栏总目录 文章目录 一、高精度定时器介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢使用 sysfs 和内核 API 函数对硬件 PWM 进行控制, 而当硬件 PWM 不够用的时候, 可以使用 GPIO 来模拟实现 PWM, 也可以称之为软件 PWM, 软件 PWM 是通过软件编程实…...
python 练习题
目录 1,输入三个整数,按升序输出 2,输入年份及1-12月份,判断月份属于大月,小月,闰月,平月,并输出本月天数 3,输入一个整数,显示其所有是素数因子 4&#…...
SprinBoot整合KafKa的使用(详解)
前言 1. 高吞吐量(High Throughput) Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息,适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下,它也能保持很高的吞吐量和性能,支持低延…...
CSS学习记录03
CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下: body {background-color: lightblue; } 通过CSS,颜色通常由以下方式指定: 有效的颜色名称-比如“…...
在Java中使用Apache POI导入导出Excel(二)
本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(一) 使用Apache POI组件操作Excel(二) 14、读取和重写工作簿 try (InputStream inp new FileInputStream("workbook.xls")) { //Inpu…...
Vue3学习宝典
1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型 import { ref } from vue // 简…...
Unity开发FPS游戏之完结篇
这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏,感兴趣的朋友可以回顾一下。这个系列的文章如下: Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…...
基于BM1684的AI边缘服务器-模型转换,大模型一体机(二)
目标追踪 注:所有模型转换都是在docker环境中的 先进入docker 这里我们是要在docker环境里编译的,所以先进入docker :~/tpu-nntc# docker run -v $PWD/:/workspace -it sophgo/tpuc_dev:latest初始化环境 root2bb02a2e27d5:/workspace/tpu-nntc# s…...
IDEA连接Apifox客户端
IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网,根据自己的操作系统下载对应的Apifox安装包,我是windows系统所以下载的是windows版。 下载 默认仅为我安装,点击下一…...
vue中引用svg图标
要在 Vue 项目中引用 SVG 图标,有几种常见的方法。这里我将介绍两种方法:一种是直接在组件中内联 SVG 代码,另一种是将 SVG 作为单独的文件引用。 方法一:内联 SVG 代码 你可以直接在 Vue 组件的模板中嵌入 SVG 代码。这种方法适…...
【Laravel】模型封装属性基础
文章目录 概要什么是封装模型属性?使用访问器和修改器封装属性访问器(Accessor)修改器(Mutator)测试业务实现 运行结果小结 概要 随着项目规模的扩大,模型中的属性和方法可能会变得越来越复杂,这…...
【ROS编译未来时间戳报错修正】一种无需重零编译的文件时间戳更新方法分享
问题描述 无论在ROS1还是ROS2使用catkin_make或者colcon build指令后,有时候会出现文件时间戳的问题,通常报错的内容大致如下文件的修改时间在未来XX秒后,警告:检测到时钟错误。您的构建版本可能是不完整的。 解决方法 不完美的…...
tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录
这些error的坑,肯定是很多人不想看到的,我的开源软件PakePlus是使用tauri开发的,PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序,利用Tauri轻松构建轻量级多端桌面应用和多端手机应用,为了实现发布的时候…...
事务常见分类
目录 1.扁平事务 2.带有保存点的扁平事务 3.链事务 4.嵌套事务 5.分布式事务 从事务理论的角度来看,可以把事务分为以下几种类型: 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Sa…...
深度学习案例:ResNet50模型+SE-Net
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 回顾ResNet模型 ResNet,即残差网络,是由微软研究院的Kaiming He及其合作者于2015年提出的一种深度卷积神经网络架构。该网络架构的核心创新在于引入了“残差连接”&…...
第三方Cookie的消亡与Google服务器端标记的崛起
随着互联网用户对隐私保护的关注日益增强,各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而,Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie? …...
arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)
arkUI:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage) 1 主要内容说明2 例子2.1 登录页2.1.1登陆页的相关说明2.1.1.1 持久化存储的初始化2.1.1.2 输入框2.1.1.3 记住密码选项2.1.1.4 登录按钮的逻辑2.1.1.5 注册跳转 2.1.…...
01-Zabbix监控快速入门
01-Zabbix监控快速入门 1、监控知识基本概述1.1 什么是监控1.2 为何需要监控1.3 如何进行监控 2、单机时代如何监控2.1 监控CPU2.2 监控内存2.3 监控磁盘2.4 监控⽹络2.5 监控TCP2.6 监控脚本示例 3、常⻅的监控⽅案3.1 Cacti3.2 Nagios3.3 Zabbix3.4 Prometheus3.5 商业监控⽅…...
docker 怎么启动nginx
在Docker中启动Nginx容器是一个简单的过程。以下是启动Nginx容器的步骤: 拉取Nginx镜像: 首先,你需要从Docker Hub拉取Nginx的官方镜像。使用以下命令: docker pull nginx运行Nginx容器: 使用docker run命令来启动一个…...
1-1 Gerrit实用指南
注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...
数据库深入(学习笔记)
多表查询 概述: 多表查询:指从多张表中查询数据笛卡尔积:笛卡尔积是指在数学中,两个集合(A集合,B集合)的所有组合情况。 分类: 连接查询 内连接:相当于查询A、B交集部分数据 隐式内连接:sele…...
PostgreSQL17.x创建数据库及数据库信息查看命令
PostgreSQL17.x创建数据库及数据库信息查看命令 文章目录 PostgreSQL17.x创建数据库及数据库信息查看命令1.创建数据库1. 使用 SQL 命令创建数据库2. 创建数据库并指定字符集3. 验证数据库是否创建成功3. 远程连接1. 修改 PostgreSQL 配置文件2. 修改客户端认证配置4. 指定某个…...
Canal mysql数据库同步到es
Canal与Elasticsearch集成指南 [可视化工具](https://knife.blog.csdn.net/article/details/126348055)下载Canal 1.1.5版本 (alpha-2) 请从GitHub Releases下载Canal 1.1.5版本中间版本alpha-2。仅需下载canal.deployer和canal.adapter组件。 安装Elasticsearch 确保已安装…...
React 前端框架1
一、React 简介 (一)什么是 React React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开源并维护。它采用了组件化的开发思想,允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件,就如同搭积木一般&am…...
什么是Batch Normalization?
一、概念 Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时…...
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable
解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…...
tauri下的两个常用rust web框架:Leptos和Trunk
tauri下有两个常用rust web框架,就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…...
vscode + conda + qt联合开发
安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境,激活这个环境,然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…...
mac终端自定义命令打开vscode
1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh,那么配置文件是.zshrc(打开zsh配置,这里举🌰使用zsh) sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本(这里的code就是快捷命令可以进…...
关于单片机的原理与应用!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///目前正在学习C😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片…...
【手术显微镜】市场高度集中,由于高端手术显微镜的制造技术主要掌握于欧美企业
摘要 HengCe (恒策咨询)是全球知名的大型咨询机构,长期专注于各行业细分市场的调研。行业层面,重点关注可能存在“卡脖子”的高科技细分领域。企业层面,重点关注在国际和国内市场在规模和技术等层面具有代表性的企业,…...
速盾高防cdn支持移动端独立缓存
随着移动互联网的快速发展,移动端网页访问量也越来越大。然而,移动端的网络环境相对不稳定,用户体验可能会受到影响。因此,使用高防CDN来加速移动端网页访问,成为越来越多网站运营者的首选。 速盾高防CDN是一种分布式…...
java中的运算符
大家好,今天来看看java中运算符的一些知识点,理解好运算符是我们在写代码的一大重点,那么我们就来看看吧。 运算符:对操作数进行操作时的符号.,不同运算筹操作的含义不同. 一、算术算片. 1、基本四则运算符:加减乘除模(一*/%) 注意:都是二元…...