《清华大学C语言教学课件(共16个PPT)第6个讲课讲稿》由会员分享,可在线阅读,更多相关《清华大学C语言教学课件(共16个PPT)第6个讲课讲稿(41页珍藏版)》请在金锄头文库上搜索。
1、清华大学C语言教学课件(共16个PPT)第6个为了表述得直观清晰,我们定义两个结点:为了表述得直观清晰,我们定义两个结点:或结点或结点与与与与结点。结点。图示的直观性与思维助力。图示的直观性与思维助力。1、或结点、或结点A为为“或结点或结点”,A依不同条件会有两种不同的取值依不同条件会有两种不同的取值B或或C。结点用。结点用 表示。表示。2如果有多于如果有多于2种取值,可用下图:种取值,可用下图:条件为条件为Z1, Z2, ,ZnZ1, Z2, ,Zn,取值为,取值为B B或或C,C,或或G G32、与结点、与结点与结点要涂黑,相关联与结点要涂黑,相关联的的B B与与C C之间要用弧线之间要用
2、弧线连起来。连起来。A A为与结点,为与结点,A A的最终取值为的最终取值为C C结点的值,但为了结点的值,但为了求得求得C C的值,得先求出的值,得先求出B B结点的值,结点的值,C C是是B B的函数。的函数。4仍以求仍以求n!为例画出如下与或图为例画出如下与或图A为或结点;为或结点;B为直接可解结点,值为为直接可解结点,值为1;C为与结点,当为与结点,当n1时,时,A的取值即的取值即C的值,而的值,而C的值即的值即E的值,为了求得的值,为了求得E的值,需要先求出的值,需要先求出D的值。的值。D值值fact(n-1)乘以乘以n即为即为E的值。的值。5与结点可能有多个相关联的点,这时可描述为
3、下图与结点可能有多个相关联的点,这时可描述为下图A结点的值最终为结点的值最终为D的值,但为了求的值,但为了求D需先求需先求B和和C。从。从图上看先求左边的点才能求最右边的点的值,我们约图上看先求左边的点才能求最右边的点的值,我们约定最右边定最右边D点的值就是点的值就是A结点的值。结点的值。6下面我们以下面我们以3!为例来画与或结点图,目的是体会递归!为例来画与或结点图,目的是体会递归的含义。的含义。C = 1D = 2*C = 2B = D = 2E = 3*B = 3*2 = 6A = E = 67下面画出了调用和返回的递归示意图下面画出了调用和返回的递归示意图8从图可以想象:从图可以想象:
4、欲求欲求fact(3),先要求,先要求fact(2);要求;要求fact(2)先求先求fact(1)。就象剥一颗圆白菜,从外向里,一层层剥下来,到了就象剥一颗圆白菜,从外向里,一层层剥下来,到了菜心,遇到菜心,遇到1的阶乘,其值为的阶乘,其值为1,到达了递归的边界。,到达了递归的边界。然后再用然后再用fact(n)=n*fact(n-1)这个普遍公式,从里向这个普遍公式,从里向外倒推回去得到外倒推回去得到fact(n)的值。的值。为了把这个问题说得再透彻一点。我们画了如下的流程为了把这个问题说得再透彻一点。我们画了如下的流程图:图:910为了形象地描述递归过程,将上图改画成下图为了形象地描述递
5、归过程,将上图改画成下图11在这个图中在这个图中“内层内层”与与“外层外层”有着相同的结构。它们有着相同的结构。它们之间之间“你中有我,我中有你你中有我,我中有你”,呈现相互依存的关系。,呈现相互依存的关系。为了进一步讲清递归的概念,将为了进一步讲清递归的概念,将递归递归与与递推递推做一比较。做一比较。仍以求阶乘为例。仍以求阶乘为例。递推递推是从已知的初始条件出发,逐次去求所需要的阶乘是从已知的初始条件出发,逐次去求所需要的阶乘值。值。如求如求3!初始条件初始条件 fact(1) = 1fact(2) = 2*fact(1) = 2fact(3) = 3*fact(2) = 612这相当于从菜
6、心这相当于从菜心“推到推到”外层。而外层。而递归递归算法的出发点不算法的出发点不放在初始条件上,而放在求解的目标上,从所求的未放在初始条件上,而放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。就本例而言,读者会认为递归算法(即初始条件)。就本例而言,读者会认为递归算法可能是多余的,费力而不讨好。可能是多余的,费力而不讨好。但许多实际问题不可但许多实际问题不可能或不容易找到显而易见的递推关系,这时递归算法能或不容易找到显而易见的递推关系,这时递归算法就表现出了明显的优越性。就表现出了明显的优越性。下面我们将会
7、看到,递归下面我们将会看到,递归算法比较符合人的思维方式,逻辑性强,可将问题描算法比较符合人的思维方式,逻辑性强,可将问题描述得简单扼要,具有良好的可读性,易于理解,许多述得简单扼要,具有良好的可读性,易于理解,许多看来相当复杂,或难以下手的问题,如果能够使用递看来相当复杂,或难以下手的问题,如果能够使用递归算法就会使问题变得易于处理。下面举一个尽人皆归算法就会使问题变得易于处理。下面举一个尽人皆知的例子知的例子哈诺(哈诺(Hanoi)塔)塔问题。问题。13故事:相传在古代印度的故事:相传在古代印度的Bramah庙中,有位僧子整天庙中,有位僧子整天把三根柱子上的金盘倒来倒去,原来他是想把把三根
8、柱子上的金盘倒来倒去,原来他是想把64个一个一个比一个小的金盘从一根柱子上移到另一根柱子上去。个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只允许移动一只盘,移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉得这很简单,真且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子的话,的动手移盘就会发现,如以每秒移动一只盘子的话,按照上述规则将按照上述规则将64只盘子从一个柱子移至另一个柱子只盘子从一个柱子移至另一个柱子上,所需时间约为上,所需时间约为5800亿年。亿年。14怎样编写这种程序?从思路上还是先从
9、最简单的情况分怎样编写这种程序?从思路上还是先从最简单的情况分析起,搬一搬看,慢慢理出思路。析起,搬一搬看,慢慢理出思路。1、在、在A柱上只有一只盘子,假定盘号为柱上只有一只盘子,假定盘号为1,这时只,这时只需将该盘从需将该盘从A搬至搬至C,一次完成,记为,一次完成,记为move 1 from A to C152、在、在A柱上有二只盘子,柱上有二只盘子,1为小盘,为小盘,2为大盘。为大盘。第(第(1)步将)步将1号盘从号盘从A移至移至B,这是为了让,这是为了让2号盘能移动;号盘能移动;第(第(2)步将)步将2号盘从号盘从A移至移至C;第(第(3)步再将)步再将1号盘从号盘从B移至移至C;这三步
10、记为:这三步记为:move 1 from A to B;move 2 from A to C;move 3 form B to C;163 3、在、在A A柱上有柱上有3 3只盘子,从小到大分别为只盘子,从小到大分别为1 1号,号,2 2号,号,3 3号号第(第(1 1)步将)步将1 1号盘和号盘和2 2号盘视为一个整体;先将二者作为号盘视为一个整体;先将二者作为整体从整体从A A移至移至B B,给,给3 3号盘创造能够一次移至号盘创造能够一次移至C C的机会。这的机会。这一步记为一步记为move( 2, A, C, B) 意思是将上面的意思是将上面的2 2只盘子作为整体从只盘子作为整体从A
11、A借助借助C C移至移至B B。第(第(2 2)步将)步将3 3号盘从号盘从A A移至移至C C,一次到位。记为,一次到位。记为move 3 from A to C第(第(3 3)步处于)步处于B B上的作为一个整体的上的作为一个整体的2 2只盘子,再移至只盘子,再移至C C。这一步记为这一步记为move( 2, B, A, C)意思是将意思是将2 2只盘子作为整体从只盘子作为整体从B B借助借助A A移至移至C C。所谓所谓借助借助是什么意思,等这件事做完了不言自明。是什么意思,等这件事做完了不言自明。17184、从题目的约束条件看,大盘上可以随便摞小盘,相、从题目的约束条件看,大盘上可以随
12、便摞小盘,相反则不允许。在将反则不允许。在将1号和号和2号盘当整体从号盘当整体从A移至移至B的过的过程中程中move(2, A, C, B)实际上是分解为以下三步实际上是分解为以下三步第(第(1).1步:步:move 1 form A to C;第(第(1).2步:步:move 2 form A to B;第(第(1).3步:步:move 1 form C to B;经过以上步骤,将经过以上步骤,将1号和号和2号盘作为整体从号盘作为整体从A移至移至B,为,为3号盘从号盘从A移至移至C创造了条件。同样,创造了条件。同样,3号盘一旦到了号盘一旦到了C,就要考虑如何实现将,就要考虑如何实现将1号和号
13、和2号盘当整体从号盘当整体从B移至移至C的过程了。实际上的过程了。实际上move(2, B, A, C)也要分解为三步:也要分解为三步:第(第(3).1步:步:move 1 form B to A;第(第(3).2步:步:move 2 form B to C;第(第(3).3步:步:move 1 form A to C;195、看、看move(2, A, C, B)是说要将是说要将2只盼自从只盼自从A搬至搬至B,但,但没有没有C是不行的,因为第(是不行的,因为第(1).1步就要将步就要将1盘从盘从A移移到到C,给,给2盘创造条件从盘创造条件从A移至移至B,然后再把,然后再把1盘从盘从C移移至至
14、B。看到这里就能明白借助。看到这里就能明白借助C的含义了。因此,在的含义了。因此,在构思搬移过程的参量时,要把构思搬移过程的参量时,要把3个柱子都用上。个柱子都用上。6、定义搬移函数、定义搬移函数move(n, A, B, C),物理意义是将,物理意义是将n只只盘子从盘子从A经经B搬到搬到C考虑到前面已经考虑到前面已经研究过的研究过的(1)(2)(3)步,可步,可以将搬移过程以将搬移过程用如下的与或用如下的与或结点图表示。结点图表示。20这里用与或结点的含义是分解为这里用与或结点的含义是分解为(1)(2)(3)步。这步。这3步是步是相关的,相互依存的,而且是有序的,从左至右执行。相关的,相互依
15、存的,而且是有序的,从左至右执行。move(n, A, B, C) 分解为分解为3步步(1)move(n-1, A, C, B)理解为将上面的理解为将上面的n-1只盘子作为一只盘子作为一个整体从个整体从A经经C移至移至B;(2)输出输出n:A to C,理解将,理解将n号盘从号盘从A移至移至C,是直接可,是直接可解结点;解结点;(3)Move(n-1, B, A, C)理解为将上面的理解为将上面的n-1只盘子作为一只盘子作为一个整体从个整体从B经经A移至移至C。21这里显然是一种递归定义,当着解这里显然是一种递归定义,当着解move(n-1, A, C, B)时时又可想到,将其分解为又可想到,
16、将其分解为3步:步:第第1步:将上面的步:将上面的n-2只盘子作为一个整体从只盘子作为一个整体从A经经B到到C,move(n-2, A, B, C);第第2步:第步:第n-1号盘子从号盘子从A直接移至直接移至B,即,即n-1:A to B;第第3步:再将上面的步:再将上面的n-2只盘子作为一个整体从只盘子作为一个整体从C经经A移移至至B,move(n-2, C, A, B);下面,我们还是以下面,我们还是以3只盘子为例画出递归的与或图。只盘子为例画出递归的与或图。22这个图很象一颗倒置着的树,结点这个图很象一颗倒置着的树,结点move(3, A, B, C)是是树根,与结点是树的分枝,叶子都是
17、直接可解结点。树根,与结点是树的分枝,叶子都是直接可解结点。232425#include /预编译命令预编译命令int step=1 ; /整型全局变量整型全局变量,预置预置1,步数步数void move(int , char ,char,char); /声明要用到的被调用函数声明要用到的被调用函数void main() /主函数主函数/主程序开始主程序开始int n; /整型变量整型变量,n为盘数为盘数,printf(请输入盘数请输入盘数n= ); /提示信息提示信息scanf(%d,&n); /输入正整数输入正整数nprintf(在在3根柱子上移根柱子上移%d只盘的步骤为只盘的步骤为:n,
18、n); /输出提示信息输出提示信息move(n,a,b,c);/调用函数调用函数 move(n,a,b,c) /主程序结束主程序结束/以下函数是被主程序调用的函数以下函数是被主程序调用的函数void move(int m, char p, char q, char r) /自定义函数自定义函数,m,p,q,r为形参,为形参,m 为整型变量为整型变量/ p,q,r 为字符型变量为字符型变量/自定义函数体开始自定义函数体开始if (m=1) /如果如果m为为1,则为直接可解结点则为直接可解结点,printf(%d move 1# from %c to %cn, step, p,r); /直接可解结
19、点直接可解结点,输出移盘信息输出移盘信息step=step+1; /步数加步数加1else/如果不为如果不为1,则要调用则要调用move(m-1)move(m-1,p,r,q); /递归调用递归调用move(m-1)printf(%d move %d# from %c to %cn,step, m,p,r); /直接可解结点直接可解结点,输出移盘信息输出移盘信息step=step+1; /步数加步数加1move(m-1,q,p,r); /递归调用递归调用move(m-1) /自定义函数体结束自定义函数体结束2627讨论问题讨论问题青蛙过河青蛙过河该题是该题是2000年全国青少年信息学奥林匹克的
20、一道试题。叙述如下:年全国青少年信息学奥林匹克的一道试题。叙述如下: 一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用我们将青蛙从小到大,用1,2,n编号。规定初始时这队青编号。规定初始时这队青蛙只能趴在左岸的石头蛙只能趴在左岸的石头L上,当然是按号排一个落一个,小的落上,当然是按号排一个落一
21、个,小的落在大的上面。不允许大的在小的上面。在小溪中有在大的上面。不允许大的在小的上面。在小溪中有S个石柱,有个石柱,有 y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求按号排一个落一个,大的在下,小的在上。对于荷叶只允许要求按号排一个落一个,大的在下,小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱一只青蛙落脚,不允许多只在其上。对于右岸的石柱R,与左岸,与左岸的石柱的石柱L一样一样 ,允许多个青蛙按号排一个落一个,小的在上,大,允许多个青蛙按号排一个落一个,小的在上,大的在下。当青蛙从左岸的的在下。当青
22、蛙从左岸的L上跳走后就不允许再跳回来;同样,上跳走后就不允许再跳回来;同样,从左岸从左岸L上跳至右岸上跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸,或从溪中荷叶或溪中石柱跳至右岸R上的上的青蛙也不允许再离开。问在已知溪中有青蛙也不允许再离开。问在已知溪中有S根石柱和根石柱和y片荷叶的情况片荷叶的情况下,最多能跳过多少只青蛙?下,最多能跳过多少只青蛙?28这题看起来较难,但是如果我们认真分析,理出思路,就可化这题看起来较难,但是如果我们认真分析,理出思路,就可化难为易。难为易。思路:思路:1 1、简化问题,探索规律。先从个别再到一般,要善于对多个、简化问题,探索规律。先从个别再到一般,要善于对多个
23、因素作分解,孤立出一个一个因素来分析,化难为易。因素作分解,孤立出一个一个因素来分析,化难为易。2. 2. 定义函数定义函数 Jump(S,y) Jump(S,y) 最多可跳过河的青蛙数最多可跳过河的青蛙数 其中:其中:S S 河中柱子数河中柱子数 y y 荷叶数荷叶数293. 先看简单情况,河中无柱子:先看简单情况,河中无柱子:S=0,Jump(0,y) 当当y=1时,时,Jump(0,1)=2; 说明:河中有一片荷叶,可以过两只青蛙,起始时说明:河中有一片荷叶,可以过两只青蛙,起始时L上有两上有两只青蛙,只青蛙,1#在在2#上面。上面。 第一步:第一步:1# 跳到荷叶上;跳到荷叶上; 第二
24、步:第二步:2# 从从L直接跳至直接跳至R上;上; 第三步:第三步:1# 再从荷叶跳至再从荷叶跳至R上。上。 如下图:如下图:30当当y=2时,时, Jump(0,2)=3; 说明:河中有两片荷叶时,可以过说明:河中有两片荷叶时,可以过3只青蛙。起始时:只青蛙。起始时: 1#,2#,3# 3只青蛙落在只青蛙落在L上,上, 第一步:第一步:1# 从从L跳至叶跳至叶 1上,上, 第二步:第二步:2# 从从L跳至叶跳至叶 2上,上, 第三步:第三步:3# 从从L直接跳至直接跳至R上,上, 第四步:第四步:2# 从叶从叶2跳至跳至R上,上, 第五步:第五步:1# 从叶从叶1跳至跳至R上,上,采用归纳法
25、:采用归纳法:Jump(0,y)=y+1Jump(0,y)=y+1; 意思是:在河中没有石柱的情意思是:在河中没有石柱的情况下,过河的青蛙数仅取决于荷况下,过河的青蛙数仅取决于荷叶数,数目是荷叶数叶数,数目是荷叶数+1+1。31再看再看Jump(S, y)Jump(S, y)先看一个最简单情况:先看一个最简单情况: S=1,y=1。从图上看出需要从图上看出需要9 9步,跳过步,跳过4 4只青蛙。只青蛙。1# 1# 青蛙从青蛙从 L L Y Y;2# 2# 青蛙从青蛙从 L L S S;1# 1# 青蛙从青蛙从 Y Y S S;3# 3# 青蛙从青蛙从 L L Y Y;4# 4# 青蛙从青蛙从
26、L L R R;3# 3# 青蛙从青蛙从 Y Y R R;1# 1# 青蛙从青蛙从 S S Y Y;2# 2# 青蛙从青蛙从 S S R R;1# 1# 青蛙从青蛙从 Y Y R R;32t tL LS SY YR RL4L4L3L3L2L2L1L1S2S2S1S1R4R4 R3R3 R2R2 R1R10 01 12 23 34 45 56 67 78 89 94 44 44 44 44 43 33 33 33 32 22 21 12 22 22 22 22 21 11 11 11 11 13 31 11 14 44 44 44 44 43 33 33 33 32 22 21 1表一表一33
27、为了将过河过程描述得更清楚,我们给出了表为了将过河过程描述得更清楚,我们给出了表1 1。表中。表中L1 L2 L1 L2 L3 L4L3 L4表示左岸石柱上落在一起的青蛙的高度位置。表示左岸石柱上落在一起的青蛙的高度位置。L1 L1 在在最上面,最上面,L4 L4 在最下面的位置。引入这个信息就可比较容易在最下面的位置。引入这个信息就可比较容易地看出对青蛙占位的约束条件。同理地看出对青蛙占位的约束条件。同理R1 R2 R3 R4R1 R2 R3 R4也是如此。也是如此。对水中石柱对水中石柱S S,也分成两个高度位置,也分成两个高度位置S1 S2S1 S2。对荷叶。对荷叶Y Y无须分无须分层,因
28、为它只允许一只青蛙落在其上。层,因为它只允许一只青蛙落在其上。t=0t=0为初始时刻,青为初始时刻,青蛙从小到大落在石柱蛙从小到大落在石柱L L上。上。t=1t=1为第一步:为第一步:1#1#从从L L跳至荷叶跳至荷叶Y Y上;上;L L上只剩上只剩2# 3# 4#2# 3# 4#。T=2 T=2 为第二步;为第二步;2#2#从从L L跳至石柱跳至石柱S S上,上,处在处在S2S2位置上,位置上,L L上只剩上只剩3#3#和和4#4#。T=3T=3为第三步,为第三步,1#1#从从Y Y跳至跳至S S,将,将Y Y清空。这时你看,清空。这时你看,S S上有上有1#1#、2#2#,L L上有上有3
29、#3#、4#4#,好,好象是原来在象是原来在L L上的上的4 4只青蛙,分成了上下两部分,上面的只青蛙,分成了上下两部分,上面的2 2只只通过荷叶通过荷叶y y转移到了转移到了S S上。这一过程是一分为二的过程。即上。这一过程是一分为二的过程。即将将L L上的一队青蛙,分解为两个队,每队各二只,且将上面上的一队青蛙,分解为两个队,每队各二只,且将上面的二只转移到了的二只转移到了S S上。这是我们可以考虑形成两个系统,一上。这是我们可以考虑形成两个系统,一个是个是L L,Y Y,R R系统,一个是系统,一个是S S,Y Y,R R系统。前者二只青蛙号系统。前者二只青蛙号大;后者二只青蛙号小。先跳
30、号大的,再跳号小的。从第大;后者二只青蛙号小。先跳号大的,再跳号小的。从第五步到第九步可以看出的确是这么做的。五步到第九步可以看出的确是这么做的。34对于对于LYRLYR系统,相当于系统,相当于Jump(0,1)Jump(0,1)对于对于SYRSYR系统,相当于系统,相当于Jump(0,1)Jump(0,1) 两个系统之和为两个系统之和为2*Jump(0,1)2*Jump(0,1),因此有:因此有:Jump(1,1)=2*Jump(0,1)=2*2=4Jump(1,1)=2*Jump(0,1)=2*2=4。现在再看现在再看S=2S=2,y=1 Jump(2,1)y=1 Jump(2,1) 我们
31、将河中的两个石柱称作我们将河中的两个石柱称作S1S1和和S2S2,荷叶叫荷叶叫y y,考虑先将,考虑先将L L上的青蛙的一半上的青蛙的一半借助于借助于S2S2和和y y转移到转移到S1S1上,当然是一上,当然是一半小号的青蛙在半小号的青蛙在S1S1上,大的留在上,大的留在L L上。上。35这样这样 L S1 S2 y R 系统分解为系统分解为 : (L S2 y R L S2 y R 系统)系统) + + (S1 S2 y R S1 S2 y R 系统)系统)= 2 * = 2 * (L S2 y R L S2 y R 系统)系统)= 2 * Jump(1,1)= 2 * Jump(1,1)用
32、归纳法用归纳法Jump(S, y)=2*Jump(S-1, y)Jump(S, y)=2*Jump(S-1, y)365. 将上述分析出来的规律写成递归形式的与或结点图为:将上述分析出来的规律写成递归形式的与或结点图为:37举例:S=3,y=4,算 Jump(3,4)38#include /预编译命令预编译命令int Jump(int, int);/声明有被调用函数声明有被调用函数void main()/主函数主函数/主程序开始主程序开始int s,y,sum;/整型变量整型变量,s为河中石柱数为河中石柱数,y为荷叶数为荷叶数printf(请输入石柱数请输入石柱数s= );/提示信息提示信息s
33、canf(%d,&s);/输入正整数输入正整数sprintf(请输入荷叶数请输入荷叶数y= );/提示信息提示信息scanf(%d,&y);/输入正整数输入正整数ysum=Jump(s,y);/Jump(s,y)为被调用函数为被调用函数printf(“Jump(%d,%d)=%dn,s,y,sum); /输出结果输出结果/主程序结束主程序结束/以下函数是被主程序调用的函数以下函数是被主程序调用的函数int Jump(int r,int z)/整型自定义函数整型自定义函数,r,z为形参为形参/自定义函数体开始自定义函数体开始int k;/整型变量整型变量if (r=0)/如果如果r为为0,则为直接可解结点则为直接可解结点,k=z+1;/直接可解结点直接可解结点,k值为值为z+1else/如果不为如果不为1,则要调用则要调用Jump(r-1,z) k=2*Jump(r-1,z);/计算计算Jump(r-1,z)再乘以再乘以2赋给赋给kreturn(k);/将将k的值返回给的值返回给Jump(s,y)/自定义函数体结束自定义函数体结束39结结 束束40此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢