shubo的博客

gopher/全干工程师

0%

剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

1
2
3
4
5
6

3
/ \
4 5
/ \
1 2

给定的树 B:

1
2
3
  4 
/
1

返回

1
true

因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000

思路

判断B是否是A的子树,我们将这个问题分为两部分:

树A的根节点记作A;
树B的根节点记作B;
1.在A树中找一个节点与B树根节点相同(前序遍历模板)
2.对比后续的节点(前序遍历模板)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Solution {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
//两个二叉树有一个为空则直接返回false
if(root1==null||root2==null) return false;
return recur(root1,root2) || HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
boolean recur(TreeNode a,TreeNode b){
// b为空,就是完成了对B这个二叉树的遍历,就是找完了返回true
if(b==null) return true;
// a为空说明越过a树的叶子结点,没匹配完,所以返回false
if(a==null) return false;
// a和b的节点值不相等,返回false
if(b.val!=a.val) return false;
// 同时前序遍历a和b这两个树,递归匹配节点
return recur(a.left,b.left) && recur(a.right,b.right);
}
}

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

1
2
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下二叉树:

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

解题思路

根据preorder和inorder重建二叉树。

已知:

前序pre :根、左、右。
中序in  :左、根、右。

每一次的递推传递的参数:

参数 含义
rootIndex 根节点的前序索引
left 中序数组中的左边界
right 中序数组中的右边界

每次递推中如何确定二叉树?
首先将中序的数组及其索引保存到哈希表{inorder[index],index},减少后续的读取时间。

1.递归的结束条件:left>right 左边界大于右边界则说明越过了叶子结点,即返回空。

2.如果当前没有越过叶子结点,则root = new TreeNode(preorder[rootIndex])就是当前的结点,

根节点索引 中序左边界 中序右边界
左子树 rootIndex+1 left index-1
右子树 rootIndex+index-left+1 index+1 right

3.返回root

代码(Java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
public class Solution {
int[] preorder;
HashMap<Integer,Integer> map=new HashMap<>();
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0||in.length==0) return null;
preorder=pre;

for(int i=0;i<in.length;i++){
map.put(in[i],i);
}
return reBuild(0,0,in.length-1);
}
public TreeNode reBuild(int rootIndex,int left,int right){
if(left>right){return null;}

int inorderIndex=map.get(preorder[rootIndex]);

TreeNode root=new TreeNode(preorder[rootIndex]);

root.left=reBuild(rootIndex+1,left,inorderIndex-1);
root.right=reBuild(rootIndex+inorderIndex-left+1,inorderIndex+1,right);

return root;
}
}

数在计算机中的表示形式统称为机器数。计算机中处理数据及运算都是采用二进制,通常规定机器数用八位二进制表示。实用的数据有正数和负数,因为计算机只能表示0、1两种状态,数据的正号“+”或负号“-”,在计算机里就用一位二进制的0或1来区别,通常放在最高位,成为符号位。 符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有:原码、反码、补码和移码,下面就分别介绍一下它们的表示方法。

1 原码、反码、补码和移码

原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。

反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。

补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)

移码:将符号位取反的补码(不区分正负)

举个例子以一个字节8位说明:

编码 108 -108
原码 01101100 11101100
反码 01101100 10010011
补码 01101100 10010100
移码 11101100 00010100

2 补码求原码

已知一个数的补码,求原码的操作分两种情况:

如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。

如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1;其余各位取反,然后再整个数加1。

3 补码加、减运算公式

在做补码加减法时,只需将符号位和数值部分一起参与运算,并且将符号位产生的进位丢掉即可

补码加法公式

  [X+Y]补 = [X]补 + [Y]补
补码减法公式
  [X-Y]补 = [X]补-[Y]补 = [X]补 + [-Y]补

其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.
假设字长为8的计算机sbyte类型所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以字长为8的二进制系统的模为2^8。

4 为何要使用原码, 反码和补码

在开始深入学习前, 我的学习建议是先”死记硬背”上面的原码, 反码和补码的表示方式以及计算方法.

现在我们知道了计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:

[+1] = [00000001]原 = [00000001]反 = [00000001]补

所以不需要过多解释. 但是对于负数:

[-1] = [10000001]原= [11111110]反= [11111111]补

可见原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?

首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (补码的绝对值称为真值即去掉符号位的二进制数字). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别”符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原= [10000010]原 = -2

如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.

为了解决原码做减法的问题, 出现了反码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0

发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在”0”这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

于是补码的出现, 解决了0的符号以及两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补+ [1111 1111]补= [0000 0000]补=[0000 0000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补+ [1000 0001]补= [1000 0000]补

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

总结:

1
2
3
4
5
原码负数不能参与运算并且不能做减法运算

反码的+0和-0的反码不相同

-128在运算中的补码是 [1000 0000]补,并没有原码和反码表示

作者:codingriver
链接:https://www.jianshu.com/p/abbdae4f3841
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最近上了十代Intel

配置清单如下:

1
2
3
4
5
CPU:            i5-10400F
显卡: 蓝宝石RX580 2304 4G
主板: 技嘉B460M AORUS ELITE
硬盘: SN750 500G
无线网卡: bcm943602cs

存在的问题:

1
2
3
4
5
6
7
睡眠问题CFG LOCK 问题
iMessage 不会搞
Facetime 不会搞



iCloud 以及AppStore 使用正常不闪退。

先上图

我的EFI 下载地址

1
https://github.com/allcando/10th-Gen-Intel-Hackintoch-EFI

基础部分(镜像以及OC/KEXT搜集)

1
2
3
BiliBili 良心UP:司波图
https://www.bilibili.com/video/BV1uf4y1X7MT?p=2&t=48

部分Kexts内容解释

文件名 功能
USBPorts.kext usb补丁
IntelMausiEthernet.kext 板载千兆网卡i219-v补丁
RadeonBoost.kext RX系列显卡适配补丁
XHCI-unsupported.kext 主板不支持XHCI需要添加此补丁

kexts 文件夹截图

安装步骤

1
2
3
4
5
6
7
8
1.根据视频教程,直接刷写BASE版本的苹果OC镜像到U盘

2.根据视频步骤,添加或删除相关的kexts文件,主要是显卡、板载网卡的相关补丁。

3.重启进入OC,然后使用从互联网上安装macos。

Tips:由于在宿舍搞,没有直接可以使用的互联网(在BASE的macos中无法认证校园网。。。。),因此使用了与视频不一样的另一种骚操作:插入另一个刷写有从[黑果小兵](https://blog.daliansky.net/)那里下载的最新镜像的u盘,此时BASE系统将会自动识别,并且可以直接安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import openpyxl

workbook = openpyxl.load_workbook("test.xlsx")

sheetnames = workbook.sheetnames

# print(sheetnames)

worksheet = workbook["总表"]

# 获取该表相应的行数和列数
CountRows = worksheet.max_row
CountColumns = worksheet.max_column

# print(columns)

worksheetnamelist = []

# 保存大表 数据清单标题
AllTitleList = []
for cell in worksheet.columns:
# print(cell[0].value)
AllTitleList.append(cell[0].value)

# 保存大表 第一列(学号)、第二列(姓名)数据
NumList = []
NameList = []
for i in range(2, 31):
NumList.append(worksheet.cell(row=i, column=1).value)
NameList.append(worksheet.cell(row=i, column=2).value)

# print(NameList[28])
# 生成工作表计数
count = 0
for start_column in range(3, CountColumns + 1, 14):
count += 1
# print(worksheet.cell(row=1, column=start_column).value)
current_worksheet = workbook.create_sheet()
current_worksheet.title = worksheet.cell(row=1, column=start_column).value
+ "-" + worksheet.cell(row=1,column=start_column + 13).value
current_worksheet.cell(1, 1, "学号")
current_worksheet.cell(1, 2, "姓名")
# 填充前两列学号姓名
for i in range(2, 31):
current_worksheet.cell(i, 1, NumList[i - 2])
current_worksheet.cell(i, 2, NameList[i - 2])
# 遍历日期列名
for i in range(start_column, start_column + 14):
print(AllTitleList[i - 1])
# print(count)
current_worksheet.cell(1, i - (count - 1) * 14, AllTitleList[i - 1])
# 填充每日体温数据区域
for j in range(2, 31):
current_worksheet.cell(j, i - (count - 1) * 14, worksheet.cell(row=j, column=i).value)

print("----")
workbook.save(filename="test.xlsx")

今天的小题大做

根据要求我需要将很多人的图片名称由原先的

身份证号_姓名_班级_学号_性别格式

改为编号_姓名的格式

并给出了新的编号表(我另存成了csv格式的文件)

本来手动改也是几分钟改完的任务量,但是一个个的点来点去的那种操作怎么能从我的手里出现呢?

上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import os
import csv

path_name = '/Users/wangshubo/Desktop/test1'
# path_name :表示你需要批量改的文件夹

list = []
index = 0


def readCSV2List(filePath):
try:
file = open(filePath, 'r', encoding='utf-8') # 读取以utf-8
context = file.read() # 读取成str
list_result = context.split("\n") # 以回车符\n分割成单独的行
# 每一行的各个元素是以【,】分割的,因此可以
length = len(list_result)
for i in range(length):
list_result[i] = list_result[i].split(",")
return list_result
except Exception:
print("文件读取转换失败,请检查文件路径及文件编码是否正确")
finally:
file.close(); # 操作完成一定要关闭


print(readCSV2List('test1.csv'))
csvlist = readCSV2List('test1.csv')#将csv文件保存到数组
for i in csvlist:
if len(i) < 6:
csvlist.remove(i)
print(len(i))
print(len(csvlist))

for item1 in os.listdir(path_name): # 进入到文件夹内,对每个文件进行循环遍历

# 照片命名要求:编号_姓名.jpg。(切记中间不要有空格且必须用短下划线隔开)
file_name = item1
print(file_name)
print(len(file_name.split("_")))
for index1 in csvlist: #此处使用了第二层循环,执行效率非常的低,临时抱佛脚只能先这样了
print(index1[2])
print(file_name.split("_")[1].strip())
print(index1[2].strip() == file_name.split("_")[1].strip())
if index1[2].strip() == file_name.split("_")[1].strip(): #通过比对姓名是否一致来重命名图片
os.rename(os.path.join(path_name, file_name), os.path.join(path_name, index1[0] + '_' + index1[2] + '.jpg'))

不多说了,备考专升本已经十个多月了,突然写代码来真的是相当生疏,网上搜来搜去七拼八凑,用了整整三个小时。。。

以此记录今日代码。

点到直线的公式:
$ d= \frac {|Ax_0+By_0+Cz_0+D|}{\sqrt(A^2+B^2+C^2)}
$

坐标lylzad ,今天刚从联通公司办理了千兆光猫更换,200M的宽带用百兆光猫怎么也说不过去啊,于是今日便得到了这台新的光猫。

刚接上路由器,令我头大的事情就发生了,这个新的光猫是光猫路由器二合一,自动给我完成了拨号,这肯定不能忍啊,我的ddns啊 !!!
于是走上了光猫管理员密码破解之路。

可以看到光猫的背面是提供了一个 普通用户的登录账号和密码的

在朋友的帮助下,看了很多帖子,整体来说有两种方法来破解:

1.通过telnet:

可以看这个贴子:山东联通 kd-yun-811e 光猫超级密码获取,不过我没有成功。而后又看了这个工具:天邑光猫配置工具貌似这个工具是适用于电信的。

2.通过修改网页js:

通过修改js绕过表单验证实现密码修改。受到一篇帖子的启发,他遇见的情况是,网页限制没有提供CUAdmin这个用户名登陆的入口,然而通过修改js的表单值,实现了使用用户名和密码都是CUAdmin的方式实现了管理账户登录。

而我也试图使用这种方法发现我的情况并不相同,如图,有两个入口,我的版本给我了CUAdmin的这个登录入口,并且我使用CUAdmin登录并没有成功。

惊喜便来了,当我使用默认的user账户登录之后发现了这么一个修改user用户密码的页面看了一会这个修改密码的提交代码后发现,改修改代码就是简单的一个post表单并且仅仅使用了几行js来验证表单数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
function submit_pwd() 
{
var docForm = document.getElementById('form_telacccfg');
with(docForm)
{
if ( window.parent.authLevel == 1)
{
if ( UserOldPassword.value != userPassword)
{
alert("旧密码输入错误!");
return;
}
}

if (UserPassword.value != AdminPassword.value)
{
alert("密码两次输入不一致!");
return;
}

var str = new String();
str = UserPassword.value;
if (str.length > 64)
{
alert('密码长度不能超过64个字符!');
return;
}
if (str.indexOf(' ') != -1)
{
alert('密码不能包含空格');
return;
}
if ( parent.authLevel == USER && str.length >= 16)
{
alert('用户密码长度不能超过15个字符!');
return;
}
if ( window.parent.authLevel == 1) //user
{
widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_CU_Function.Web.UserPassword', UserPassword);

}
else{
if( $("Username_text").options[0].selected == true) //admin
{
//widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_BROADCOM_COM_LoginCfg.AdminPassword', UserPassword);
//对‘#’特殊字符进行转义 add by:wh 2017.9.28
// if(str.indexOf('#')>-1){
// str=str.split("#");
// var passwordStr=str[0]+'%23'+str[1];
// loc = "userpasswd.htm?a=set&x=InternetGatewayDevice.X_CU_Function.Web.AdminPassword&AdminPassword=" + passwordStr;
// }
// else{
// loc = "userpasswd.htm?a=set&x=InternetGatewayDevice.X_CU_Function.Web.AdminPassword&AdminPassword=" + str;
// }
// var code = 'location="' + loc + '"';
// eval(code);
widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_CU_Function.Web.AdminPassword', AdminPassword);
}
else //user
{
widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_CU_Function.Web.UserPassword', UserPassword);
}
}
}
return true;
}


代码修改为:

function submit_pwd()
{
var docForm = document.getElementById('form_telacccfg');
with(docForm)
{

if( $("Username_text").options[0].selected == true) //admin
{
widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_CU_Function.Web.AdminPassword', AdminPassword);
}
else //user
{
widget.submitElemIndep('userpasswd.htm', 'set', 'InternetGatewayDevice.X_CU_Function.Web.UserPassword', UserPassword);
}

}
return true;
}

具体操作不再上图,学过一点点前端js的朋友相信都能做得到。

所以我实际做的事情就是,删除js中的所有的验证代码,以及修改选择器中的值为CUAdmin
如图

直接输入想要设置的密码然后点击保存就可以了。

一、讨论等比级数(也称几何级数)

$$\sum_{i=1}^{\infty} aq^{n-1} =a+aq+aq^2+…+aq^n-1+…\$$
的敛散性,其中$$a$$ $$\not=$$ $$0,q$$是级数的公比

解:


$$
S_n=a+aq+aq^2+…+aq^n-1\
=\begin{cases}

na& \text{q=1}\\

\frac{a(1-q^{n-1})}{1-q}& \text{q!=1}

\end{cases}
$$


$$
\lim_{x\rightarrow\infty} Sn=
\begin{cases}

\lim_{x\rightarrow\infty} a_n=\infty& \text{q=1}\\

\lim_{x\rightarrow\infty} \frac{a(1-q^{n})}{1-q}& \text{q!=1}

\end{cases}
$$


综上:

$$|q|<1时,\lim_{x\rightarrow\infty} Sn=\frac{a}{1-q}\$$
$$|q|\geq1时,\lim_{x\rightarrow\infty} Sn不存在\$$

结论:

$$当|q|<1时,\sum_{i=1}^{\infty} aq^{n-1}=\frac{a}{1-q},\$$
$$当|q|\geq1时,\sum_{i=1}^{\infty} aq^{n-1}发散。
$$

二、P——级数

$$
P——级数:
\sum_{i=1}^{\infty} \frac{1}{n^P}
=\begin{cases}

收敛& \text{P>1时}\\

发散& \text{P<=1时}

\end{cases}
$$

调和级数(发散)

当P——级数中P=1时,称为调和级数
$$\sum_{i=1}^{\infty} \frac{1}{n}=1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n}+…$$

三、级数相加的敛散性变化

$$1.若\sum_{i=1}^{\infty}u_n收敛,而\sum_{i=1}^{\infty}v_n发散,\则\sum_{i=1}^{\infty}(u_n+v_n)发散$$

$$2.若\sum_{i=1}^{\infty}u_n,\sum_{i=1}^{\infty}v_n都收敛,\则\sum_{i=1}^{\infty}(u_n+v_n)收敛$$

$$3.若\sum_{i=1}^{\infty}u_n,\sum_{i=1}^{\infty}v_n都发散,\则\sum_{i=1}^{\infty}(u_n+v_n)有可能收敛$$

四、正项级数

$$若u_n>0,n=1,2,3…,则称\sum_{i=1}^{\infty}u_n为正项级数$$

正项级数的敛散性判别法

1.定义法:

$$若正项级数\sum_{i=1}^{\infty}u_n收敛\longleftrightarrow \lim_{x\rightarrow\infty} S_n=s$$

2.基本定理法:

$$若正项级数\sum_{i=1}^{\infty}u_n的前n项和数列{S_n}有上界,\则\sum_{i=1}^{\infty}u_n收敛。$$

3.正项级数比较审敛法:

Th1:(比较审敛法)

$$设正项级数\sum_{i=1}^{\infty}u_n和\sum_{i=1}^{\infty}v_n$$

$$(1)若u_n\leq v_n(n=1,2,…)且\sum_{i=1}^{\infty}v_n收敛,\则\longrightarrow \sum_{i=1}^{\infty}u_n收敛$$

证明:

$$\because \sum_{i=1}^{\infty}v_n 收敛 \longrightarrow \lim_{x\rightarrow\infty} S_n^{(1)}=s \longrightarrow {S_n^{(1)}} 有界 $$

$$即\exists M>0,\forall n \in N^*,有0<S_n^{(1)}<M$$

$$S_n^{(2)}=u_1+u_2+…+u_n\leq \v_1+v_2+…+v_n=S_n^{(1)}\leq M$$
$$\therefore 由2.基本定理知\sum_{i=1}^{\infty}u_n收敛$$

$$(2)若u_n\geq v_n(n=1,2,…)且\sum_{i=1}^{\infty}v_n发散,\则\longrightarrow \sum_{i=1}^{\infty}u_n发散$$

Th2:比较审敛法的极限形式

$$设正项级数\sum_{i=1}^{\infty}u_n和\sum_{i=1}^{\infty}v_n,且\lim_{n\to\infty} \frac{u_n}{v_n}=l$$
$$(1)0<l<+\infty时,则\sum_{i=1}^{\infty}u_n和\sum_{i=1}^{\infty}v_n\具有相同的敛散性。$$
$$(2)l=0时,若\sum_{i=1}^{\infty}u_n收敛,则\sum_{i=1}^{\infty}v_n收敛$$
$$(3)l=+\infty时,若\sum_{i=1}^{\infty}u_n发散,则\sum_{i=1}^{\infty}v_n发散$$
以上“比较审敛法的极限形式”的方法需要自行构造合适的$v_n$以求$u_n$敛散性

Th3:(比值审敛法)

$$正项级数\sum_{i=1}^{\infty}u_n,若p=\lim_{n\to\infty} \frac{u_{n+1}}{u_n},则$$
$$(1)0\leq p<1时,则\sum_{i=1}^{\infty}u_n收敛$$
$$(2)p>1时,则\sum_{i=1}^{\infty}u_n发散$$
$$(3)p=1时,可能收敛,可能发散$$

一般情况用比值审敛法来求带阶乘级数的敛散性

Th4:(根植审敛法)

$$正项级数\sum_{i=1}^{\infty}u_n,若p=\lim_{n\to\infty} \sqrt[n]{u_n},则$$
$$(1)0\leq p<1时,则\sum_{i=1}^{\infty}u_n收敛$$
$$(2)p>1时,则\sum_{i=1}^{\infty}u_n发散$$
$$(3)p=1时,可能收敛,可能发散$$
$$根值审敛法一般用于求带u_n=\frac{\alpha^n}{n^s}的这种形式$$

五、交错级数

$$定义:若u_n>0,\称\sum_{i=1}^{\infty}(-1)^nu_n或\sum_{i=1}^{\infty}(-1)^{n-1}u_n为交错级数$$

莱布尼兹判别法:

$$若交错级数满足:\
(1){u_n}单调减少\
(2)\lim_{n\to\infty} u_n= 0\
则该交错级数收敛
$$

绝对收敛和条件收敛

$$
定义:若|u_n|收敛,则称\sum_{i=1}^{\infty}u_n绝对收敛\
若\sum_{i=1}^{\infty}u_n收敛,但\sum_{i=1}^{\infty}|u_n|发散,\则称为条件收敛\

\star 绝对收敛的级数必定收敛
$$

六、幂级数(函数项级数):

$${u_n(x)}函数列\\sum_{i=1}^{\infty}u_n(x)=u_1(x)+u_2(x)+…+u_n(x)+…$$

定义:

$$(1)\forall x_0\in D 若\sum_{i=1}^{\infty}u_n(x_0)收敛,\
则称x_0为函数项级数\sum_{i=1}^{\infty}u_n(x)的收敛点,\
否则x_0为\sum_{i=1}^{\infty}u_n(x)的发散点。\
(2)收敛域:\所有收敛点的集合称为函数项级数\\sum_{i=1}^{\infty}u_n(x)的收敛域。
$$

不缺项幂函数收敛域、收敛区间求法:

$$\sum_{n=0}^{\infty}a_n(x-x_n)^n$$
$$记作:\a_0+a_1(x-x_0)+a_2(x-x_0)^2+…+a_n(x-x_0)^n+…$$
$$\star \sum_{n=0}^{\infty}a_nx^n=a_0+a_1x+a_2x^2+…+a_nx^n+…$$

$$Th:如果\lim_{n\to\infty} |\frac{a_{n+1}}{a_n}|= l\
其中a_n,a_{n+1}是幂级数\\sum_{n=0}^{\infty}a_nx^n相邻两项的系数,\则此幂级数的收敛半径为R\
\
\

R
=\begin{cases}

\frac{1}{l}& \text{l!=0}\

\infty& \text{l=0}\

0& \text{l=∞}
\end{cases}

\
\sum_{n=0}^{\infty}a_nx^n在(-R,R)内收敛。\
收敛域则通过带入验证,收敛域可能为:\
[-R,R],[-R,R),(-R,R),(-R,R]

$$

缺项的幂函数收敛域、收敛区间求法:

$$\sum_{n=0}^{\infty}a_nx^{2n}和\sum_{n=0}^{\infty}a_nx^{2n+1}\
p=\lim_{n\to\infty} |\frac{u_{n+1}(x)}{u_{n}(x)}|\= \lim_{n\to\infty} |\frac{a_{n+1}x^{2n+2}}{a_{n}x^{2n}}|\\=\lim_{n\to\infty} |\frac{a_{n+1}}{a_{n+1}}x^2|<1\
x^2<\frac{1}{l},\
R=\frac{1}{l}=\frac{1}{\sqrt{l}}
收敛区间(-R,R),\
收敛域,同不缺项的幂级数求法相同。
$$

幂级数和函数的性质

$$\sum_{n=0}^{\infty}a_nx^n=s(x)\
x\in收敛域,收敛半径为R\
$$

性质:

$$(1)和函数s(x)在(-R,R)内连续\
(2)逐项积分:\int_0^x s(t)dt\
=\int_0^x \sum_{n=0}^{\infty}a_nt^n dt\
=\sum_{n=0}^{\infty}\int_0^x a_nt^n dt\
=\sum_{n=0}^{\infty}a_n\frac{x^{n+1}}{n+1}\
(3)逐项求导:s(x)在(-R,R)内可导,逐项都可导\
即s’(x)=\int_0^x s(t)dt\
=(\sum_{n=1}^{\infty} a_nx^n)’\
=\sum_{n=1}^{\infty}(a_nx^n)’\
=\sum_{n=1}^{\infty}na_nx^{n-1}
$$

幂级数 和函数的求法

$$
(1)当幂级数的一般项形式\
如\frac{x^n}{n(n+1)}时,\
可先用求导后求积分的方法求其和函数。\
(2)当幂级数的一般项形式如\
(2n+1)x^{2n},n(x)^{n-1}等时\
可“先积后导”\
(3)常用的幂级数展开式\

\star \frac{1}{1-x}=\sum_{n=0}^{\infty}x^n\
=1+x+x^2+…+x^n+…(-1<x<1)\
\star \frac{1}{1+x}=\sum_{n=0}^{\infty}(-1)^nx^n\
=1-x+x^2-…+x^n+…(-1<x<1)\
$$

函数展开成幂级数

$$
y=f(x)在x=x_0的邻域内,\
(任意阶可导)具有充分的光滑性\
泰勒级数:\
f(x)=f(x_0)+\frac{f’(x_0)}{1!}(x-x_0)\
+\frac{f’’(x_0)}{2!}(x-x_0)^2+…\
+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+…\
当x_0=0时,\
即为麦克劳林级数:\
f(x)=f(0)+\frac{f’(0)}{1!}x\
+\frac{f’’(0)}{2!}x^2+…+\frac{f^{(n)}(0)}{n!}x^n+…\

$$

常用的几个函数展开

$$
(1)e^x=1+x+\frac{1}{2!}x^2+…+\frac{1}{n!}x^n+… \
x\in (-\infty,+\infty)\
(2)sinx=x-\frac{1}{3!}x^3+\frac{1}{5!}x^5-\frac{1}{7!}x^7\
+…+\frac{(-1)^{n-1}}{(2n-1)!}x^{2n-1}+…\
x\in (-\infty,+\infty)\
(3)cosx=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^4}{6!}\
+…+\frac{(-1)^{n-1}}{(2n)!}x^{2n}+…\
x\in (-\infty,+\infty)\
(4)ln(1+x)=x-\frac{x^2}{2}+\frac{x^3}{3}-…\+(-1)^n\frac{x^{n+1}}{n+1}+… \
x\in(-1,1]
$$

微分中值定理

罗尔中值定理

如果 $R$ 上的函数 $f(x)$ 满足以下条件:
在闭区间 $[a,b]$ 上连续,
在开区间 $(a,b)$ 内可导,
$f(a)=f(b)$,则至少存在一个 $ξ∈(a,b)$,使得 $f’(ξ)=0$。

拉格朗日中值定理

如果函数$f(x)$满足:
在闭区间$[a,b]$上连续;
在开区间$(a,b)$内可导;
那么在开区间$(a,b)$内至少有一点$ξ∈(a,b)$ 使等式$f(b)-f(a)=f’(ξ)(b-a)$ 成立。

积分中值定理

第一积分中值定理

若函数$f(x)$:
在闭区间$[a,b]$上连续,
则在积分区间$[a,b]$上至少存在一个点,
使下式成立$\int_a^b f(x)dx=f(\xi)(b-a)$

证明

设在 $f(x)$在$[a,b]$上连续,因为闭区间上连续函数必有最大最小值,不妨设最大值为$M$ ,最小值为 $m$,

最大值和最小值可相等。
对$m<f(x)<M$两边同时积分可得:
$$m(b-a)≤\int^b _af(x)dx≤M(b-a)$$
同除以(b-a)从而得到:
$$m≤\frac{1}{b-a}\int^b _af(x)dx≤M$$
由连续函数的介值定理可知,必定$\existξ\in [a,b]$ ,使得$f(ξ)=\frac{1}{b-a}\int^b _af(x)dx$,即:
$$\int^b _af(x)dx=f(ξ)(b-a),\existξ\in [a,b]$$
命题得证。

第二积分中值定理

设$f(x)g(x)$在$[a,b]$上连续,且$g(x)$在$[a,b]$上恒号,则$\existξ\in [a,b]$使

$$\int^b _af(x)g(x)dx=f(ξ)\int^b _ag(x)dx$$
第一中值定理就是第二中值定理的特例,$g(x)\equiv1$