1、第3章 算法基本工具和优化技巧,31 循环与递归 32 算法与数据结构 33 算法优化基本技巧 34 优化算法的数学模型,循环设计要点 递归设计要点 递归与循环的比较,3.1 循环与递归,1设计中要注意算法的效率 2“自顶向下”的设计方法 3由具体到抽象设计循环结构 ,一、循环设计要点,循环体的特点是:“以不变应万变”。 所谓“不变”是指循环体内运算的表现形式是不变的,而每次具体的执行内容却是不尽相同的。在循环体内用不变的运算表现形式去描述各种相似的重复运算。,1循环设计中要注意算法的效率,【例】求,数学模型1:,main( ) int i,n,j,sign=1;float s,t=1;inp
2、ut(n);s=1;for(i=2;i=n;i=i+1) t=1; /求阶乘for(j=1;j=2*i-1;j=j+1)t=t*j;sign=1; /求(-1)n+1for(j=1;j=i+1;j=j+1)sign = sign *(-1);s=s+sign/t;print(“Sum=”,s); ,算法的时间复杂度:O(n2)效率较低! (2n-1)! = (2(n-1)-1)! * (2n-2) * (2n-1),数学模型2:,main( ) int i,n, sign;float s,t=1;input(n);s=1;sign=1; for(i=2;i=n;i=i+1) sign=-sig
3、n; t=t*(2*i-2)*(2*i-1);s=s+ sign/t; print(“Sum=”,s); ,算法的时间复杂度:O(n),2“自顶向下”的设计方法 自顶向下的方法是从全局走向局部、从概略走向详尽的设计方法。自上而下是系统分解和细化的过程。,【例】一个数如果恰好等于它的因子之和(包括1,但不包括这个数本身),这个数称为“完数”。编算法找出1000以内所有完数。例如,28的因子为1、2、4、7,14(每个因数只记一次),而28=1+2+4+7+14。因此28是“完数”。输出格式如下:28 its factors are 1,2,4,7,14。,1)顶层算法,for(i=2;i=100
4、0;i=i+1) 判断i是否为“完数”;是“完数”则按格式输出; ,2)判断i是否为“完数”,for(j=2;ji;j=j+1)找i的因子,并累加 如果累加值为i,则是“完数”,3)进一步细化判断i是否“完数”算法,s=1; for(j=2;ji;j=j+1)if (i mod j=0) s=s+j; if(s=i) i是“完数”;,4)考虑输出格式判断i是否“完数”算法考虑到要按格式输出结果,应该开辟数组存储数据i的所有因子,并记录其因子的个数,因此算法细化如下:,定义数组a,s=1; k=0; for(j=2;ji;j=j+1)if (i mod j=0) (j是i的因素) s=s+j;a
5、k=j;k=k+1; if(s=i) 按格式输出结果 ,算法如下:,main( ) int i,k,j,s,a20;for(i=1;i=1000;i+) s=1; k=0; for(j=2;ji;j+)if (i mod j=0) s=s+j; ak=j; k+;if(i=s) print(s, “its factors are :”,1);for(j=0;ik;j+)print(“,”,ak); ,对于不太熟悉的问题,其数学模型或“机械化操作步骤”的不易抽象,下面看一个由具体到抽象设计循环细节的例题。【例】编写算法:打印具有下面规律的图形。1 5 2 8 6 3 10 9 7 4,3由具体到
6、抽象设计循环结构,main( ) int i,j,a100100,n,k;input(n);k=1;for(i=0;i=n-1;i=i+1)for(j=0;j=n-i; j=j+1) ai-1+jj=k;k=k+1;for(i=0;i=n-1;i=i+1) print( “换行符”); for(j=0;j=i;j=j+1)print(aij); ,二、递归设计要点,思想:把一个复杂问题转换为一个与原问题相似的规模较小问题。设计方法: 问题描述:定义递归模块形式; 递归关系:大规模问题与小规模问题的关系; 停止条件:所描述问题的最简单情况,它本身不再使用递归的定义。,【例】汉诺塔问题,古代有一个
7、梵塔,塔内有3个基座A、B、C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘子,且在移动过程中在3个基座上的盘子都始终保持大盘在下,小盘在上。在移动过程中可以利用C基座做辅助。请编程打印出移动过程 。,递归关系:,把n阶的汉诺塔问题的模块记作hanoi(n,a,b,c) a:起始基座, b: 终点基座, c: 辅助基座,问题描述:,则汉诺塔问题hanoi(n,a,b,c)等价于以下三步:第一步,hanoi(n-1,a,c,b); 第二步,把下面“一个”盘子从a基座移到b基座; 第三步, hanoi(n-1,c,
8、b,a)。,停止条件:,当n=1时:ab,算法如下:,hanoi(int n,char a,char b,char c) if(n=1)print(a,”,b);else hanoi(n-1,a,c,b);print(a,”, b);haboi(n-1,c,b,a); ,三、递归与循环的比较,递归与循环都是解决“重复操作”的机制。,递归使一些复杂的问题处理起来简单明了。,就效率而言,递归算法的实现往往要比迭代算法耗费更多的时间(调用和返回均需要额外的时间)与存贮空间(用来保存不同次调用情况下变量的当前值的栈栈空间),也限制了递归的深度。,每个迭代算法原则上总可以转换成与它等价的递归算法;反之不
9、然 。,递归的层次是可以控制的,而循环嵌套的层次只能是固定的,因此递归是比循环更灵活的重复操作的机制。,【例】任给十进制的正整数,请从高位到低位逐位输出各位数字。,f3(n) int j,i=0,a16;while(n=10) ai=n mod 10;i=i+1;n=n10;ai=n;for(j=i;j=0;j=j-1)print(n); ,循环算法如下:,f4(n) if(n10)print(n);else f4(n10);print(n mod 10); ,递归算法设计:,算法分析,递归算法程序更简单,可读性好 函数递归调用时需要保存现场,并开辟新的运行资源;返回时,又要回收资源。因此递归
10、算法的时间复杂度和空间复杂度相对较高,【例】找出n个自然数(1,2,3,n)中r个数的组合。,例如,当n=,r=3时,所有组合为:1 2 31 2 41 2 51 3 41 3 51 4 52 3 42 3 52 4 53 4 5total=10 组合的总数,循环算法1:,Constitute1() int n=5,i,j,k,t;t=0;for(i=1;i=n;i-)for(j=1;j=n;j-) for(k=1;k=n;k-)if(ij)and(jk)t=t+1; print(total=,t);,时间复杂度O(n3),循环算法2:,constitute2() int n=5,r=3,i,
11、j,k,t;t=0;for(i=1;i=n-r+1; i=i+1)for(j=i+1;j= n-r+2;j=j+1)for(k=j+1;k=n-r+3;k=k+1)t=t+1; print(total=,t); ,效率稍好,时间复杂度还是O(n3),用递归法设计此题:,问题描述:,comb(n,r):从n个自然数中取r个的组合数,递归关系:,comb(n,r)= comb(n-1,r-1)+comb(n-2,r-1)+comb(r-1,r-1),停止条件:,comb(n,1)=n comb(n,n)=1,递归算法如下:,int comb(int n,int r) int i,s; if(r=1
12、)return n;else if(n=r)return 1;else s=0for (i=n-1;i=r-1;i-) s=s+ comb(i,r-1); return s; ,r层递归,每个算法递归n-r+1次。因此时间复杂度为O(n*r),算法分析,递归的层次是可以控制的,而循环嵌套的层次只能是固定的,递归与非递归的比较:,3.2 算法与数据结构,数据的逻辑结构常分为四大类: (1)集合结构 (2)线性结构 (3)树形结构 (4)图结构(网结构),存储结构可以分为:连续存储和链式存储。连续存储又可以分为:静态存储和动态存储,1、常用的几种数据结构,顺序存储的优点:(1) 方法简单,各种高级
13、语言中都提供数组结构,容易实现。(2) 不用为表示结点间的逻辑关系而增加额外的存储开销。(3) 顺序表具有按元素序号随机访问的特点。,2、连续存储和链式存储比较,顺序存储的缺点:(1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低。(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。,温馨提示:链表的优缺点恰好与顺序表相反。,3、在选取存储结构时权衡因素有:,)基于存储的考虑顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对“MAXSIZE”要有合适的设定,过大造成浪费
14、,过小造成溢出。可见对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低。,)基于运算的考虑在顺序表中按序号访问ai的时间性能时O(1),而链表中按序号访问的时间性能O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;但对于插入、删除操作,则后者优于前者。)基于环境的考虑顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,操作简单。,一、原始信息与处理结果对应存储,每一个问题中的信息往往是多方面的,在算法中一般有输入信息、输出信息和信息加工处理过程中的中间信息。那么哪些信息需要用数组进行存储,数组元素下标与信息怎
15、么样对应等问题的确定,在很大程度上影响着算法的编写效率和运行效率。,【例】某校决定由全校学生选举学生会主席。有5个候选人,编号分别为1,2,3,4,5,选举其中一人为学生会主席,每个学生一张选票,只能填写一人。请编程完成统计选票的工作。,算法如下:,vote( ) int i,xp,a5=0,0,0,0,0;input(xp );while(xp!=-1) if (xp=1 and xp=5 )axp=axp+1;elseprint(xp, “input error!“); input(xp );for (i=1;i=5;i+)print(i,“number get“, ai, “votes“
16、); ,【例】编程统计身高(单位为厘米)。统计分150154;155159;160164;165169;170174;175179及低于是150、高于是179共八档次进行。 算法设计:,算法如下:,main( ) int i,xp,a8;input(sg);while(sg-1) if(sg179) a7=a7+1;else if(sg150) a0=a0+1;else asg/5-29=asg/5-29+1;input(sg);for (i=0;i=7;i=i+1)print(i+1,“field the number of people:”,ai); ,二、数组使信息有序化,当题目中的数据
17、缺乏规律时,很难把重复的工作抽象成循环不变式来完成,但先用数组结构存储这些地信息后,问题就迎刃而解了,,【例】编程将编号“翻译”成英文。例35706“翻译”成three-five-seven-zero-six。,main( )int i,a10,ind; long num1,num2;char eng106=“zero”,”one”,”two”,”three ”,” four”,” five”,”six”,”seven”,“eight”,”nine”;input(num1); num2=num1; ind=0;while(num20) aind=num2 mod 10;ind=ind+1; n
18、um2=num2/10; for(i=ind-2;i=0;i=i-1)print(“-”,engai); ,三、数组记录状态信息,问题提出:有的问题会限定在现有数据中,每个数据只能被使用一次,怎么样表示一个数据“使用过”还是没有“使用过”?一个朴素的想法是:用数组存储已使用过的数据,然后每处理一个新数据就与前面的数据逐一比较看是否重复。这样做,当数据量大时,判断工作的效率就会越来越低。,【例】求X,使X2为一个各位数字互不相同的九位数。总体分析:只能用枚举法尝试完成此题。由X2为一个九位数,估算X应在1000032000之间。,main() long x,y1,y2;int p10,i,t,k
19、,num=0;for(x=10000;x32000; x=x+1) for(i=0;i=9;i=i+1) pi=1;y1=x*x; y2=y1; k=0;for(i=1;i=9;i=i+1) t=y2 mod 10; y2=y2/10;if(pt=1) k=k+1; pt=0;else break;if(k=9) num=num+1; print(“No.”,num,“:n=”,x,“n2=”,y1); ,四、大整数的存储及运算,计算机存储数据是按类型分配空间的。在微型机上为整型提供2个字节16位的存储空间,则整型数据的范围为-3276832767;为长整型提供4个字节32位的存储空间,则长整
20、型数据的范围为-21474836482147483647;为实型也是提供4个字节32位的存储空间,但不是精确存储数据,只有六位精度,数据的范围(3.4e-383.4e+38) ;为双精度型数据提供8个字节64位的存储空间,数据的范围(1.7e-3081.7e+308),其精确位数是17位。,【例】编程求当N=100时,N!的准确值 问题分析:问题要求对输入的正整数N,计算N!的准确值,而N!的增长速度仅次于指数增长的速度,所以这是一个高精度计算问题。 例如: 9!=362880 100! = 93 326215 443944 152681 699263 856266 700490 715968
21、 264381 621468 592963 895217 599993 229915 608914 463976 156578 286253 697920 827223 758251 185210 916864 000000 000000 000000 000000,main() long a256=0,b,d; int m,n,i,j,r;input(n); m=log(n)*n/6+2; 粗略估计n!的位数a1=1; d=0;for(i=2;i0) aj=d;m=m+1;,print(n,“!=”); print(am);for(i=m-1;i=1;i-) if(ai99999) prin
22、t(ai);else if(ai9999) print( “0”,ai);else if(ai999) print( “00”,ai); else if(ai99) print( “000”,ai); else if(ai9) print( “0000”,ai); else print( “00000”,ai);/for ,五、构造趣味矩阵,趣味矩阵 经常用二维数组来解决,根据趣味矩阵中的数据规律,设计算法把要输出的数据存储到一个二维数组中,最后按行输出该数组中的元素。,基本常识: 1)当对二维表按行进行操作时,应该“外层循环控制行;内层循环控制列”;反之若要对二维表按列进行操作时,应该“外层
23、循环控制列;内层循环控制行”。 2)二维表和二维数组的显示输出,只能按行从上到下连续进行,每行各列则只能从左到右连续输出。所以,只能用“外层循环控制行;内层循环控制列”。,2,3)用i代表行下标,以j代表列下标(除特别声明以后都遵守此约定),则对n*n矩阵有以下常识: 主对角线元素i=j; 副对角线元素: 下标下界为1时 i+j=n+1,下标下界为0时 i+j=n-1; 主上三角元素: i=j; 次上三角元素:下标下界为1时i+j=n+1,下标下界为0时i+j=n-1;,【例】编程打印形如下规律的n*n方阵。,例如下图:使左对角线和右对角线上的元素为0,它们上方的元素为1,左方的元素为2,下方
24、元素为3,右方元素为4,下图是一个符合条件的阶矩阵。 0 1 1 1 0 2 0 1 0 4 2 2 0 4 4 2 0 3 0 4 0 3 3 3 0,main( ) int i,j,a100100,n;input(n);for(i=1;ij) a ij=2;if (i+jn+1 and ij) a ij=3;if (i+jn+1 and ij) a ij=4; for(i=1;i=n;i=i+1)print( “换行符”); for( j=1;j=n;j=j+1)print(aij); ,n=3 输出: 1 8 72 9 63 4 5 n=4 输出: 1 12 11 102 13 16 9
25、3 14 15 84 5 6 7,【例】螺旋阵:任意给定n值,按如下螺旋的方式输出方阵:,算法设计:,算法设计1:此例可以按照“摆放”数据的过程,逐层(圈)分别处理每圈的左侧、下方、右侧、上方的数据。以n=4为例详细设计如下:把“112”看做一层(一圈)“13-16”看做二层以层做为外层循环,下标变量为i。由以上两个例子,n=3、4均为两层,用n2表示下取整,这样(n+1)/2下好表示对n/2上取整。所以下标变量i的范围1(n+1)/2。,i层内“摆放”数据的四个过程为(四角元素分别归四个边): 1) i列(左侧),从i行到n-i行 ( n=4,i=1时 “摆放1,2,3”) 2) n+1-i
26、行(下方),从i列到n-i列 ( n=4,i=1时 “摆放4,5,6”) 3) n+1-i列(右侧),从n+1-i行到i+1行 ( n=4,i=1时 “摆放7,8,9”) 4) i行(上方),从n+1-i列到i+1列 ( n=4,i=1时 “摆放10,11,12”) 四个过程通过四个循环实现,用j表示i层内每边中行或列的下标。,main( ) int i,j,a100100,n,k;input(n); k=1;for(i=1;i=i+1;j=j-1) ajn+1-i=k;k=k+1; /右侧for(j=n-i+1;j=i+1;j=j-1) aij=k; k=k+1; /上方if(n mod 2
27、=1) i=(n+1)/2; aii=n*n;for(i=1;i=n;i=i+1) print(“换行符”); for(j=1;j=n;j=j+1)print(aij); ,3.3 算法优化基本技巧,【例】一次考试,共考了五门课。统计五十个学生中至少有三门课成绩高于90分的人数。,main( ) int a5,i,j,s,num=0;for ( i=1;i=90)s=s+1; if(s=3)num=num+1;print(“The number is”,num); ,一、算术运算的妙用,算法说明:对于计算其成绩高于90分的课程数目,还可以简单地这样实现:,s=0; for(j=0;j=90);
28、 ,二、标志量的妙用,【例】冒泡排序算法的改进,main() int i,j,t,n,a100,flag;input(n);for(i=0;i=i;j-)if(ajaj-1) t=aj; aj=aj-1; aj-1=t;flag=1;for(i=0;in;i+) print(ai); ,三、信息数字化,【例】警察局抓了a,b,c,d四名偷窃嫌疑犯,其中只有一人是小偷。审问中 a说:“我不是小偷。” b说:“c是小偷。” c说:“小偷肯定是d。” d说:“c在冤枉人。” 现在已经知道四个人中三人说的是真话,一人说的是假话, 问到底谁是小偷? 问题分析:将a,b,c,d将四个人进行编号,号码分别
29、为1,2,3,4。则问题可用枚举尝试法来解决。,算法设计:用变量x存放小偷的编号,则x的取值范围从1取到4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成:a说的话:x1b说的话:x=3c说的话:x=4d说的话:x4注意:在x的枚举过程中,当这四个逻辑式的值相加等于3时,即表示“四个人中三人说的是真话,一人说的是假话”。,main( ) int x;for(x=1;x1)+(x=3)+(x=4)+(x4)=3)print(chr(64+x),“is a thief .”); 运行结果:c is a thief .,【例】编写算法对输入的一个整数,判断它能否被3,5,7整除,
30、并输出以下信息之一:(1) 能同时被3,5,7整除;(2) 能被其中两数(要指出哪两个)整除;(3) 能被其中一个数(要指出哪一个)整除;(4) 不能被3,5,7任一个整除。,main( ) long n;int k;print(“Please enter a number:”);input(n);k=(n mod 3=0)+(n mod 5=0)+(n mod 7=0)switch (k) case 3: print(“n All”); break;case 2: print(“n two”); break;case 1: print(“n one”); break;case 0: prin
31、t(“n none“); break; ,算法1:,main( ) long n;int k;print(“ Please enter a number:”);input(n);k=(n mod 3=0)+(n mod 5=0)* 2+(n mod 7=0)* 4switch (k) case 7: print(“ All”); bresk;case 6: print(“ 5 and 7 ”); break;case 5: print(“ 3 and 7 ”); break;case 4: print(“ 7 ”); break;case 3: print(“ 3 and 5 ”); brea
32、k;case 2: print(“ 5 ”); break;case 1: print(“ 3 ”); break;case 0: print(“ none“); break;,算法2:,3.4 优化算法的数学模型,1认识数学模型和数学建模,【例】已知有5个数,求前四个数与第五个数分别相乘后的最大值。,int max2(int a,b,c,d,e) int xif (ab)x=a;elsex=b;if (cx)x=c;if (dx)x=d; x=x*e;return (x); ,int max1(int a,b,c,d,e) int x ;a=a*e;b=b*e;c=c*e;d=d*e;if(
33、ab)x=a;elsex=b;if (cx)x=c;if (dx)x=d; return(x); ,以上两个算法基于的数学模型是不同的,一个算法先积再求最大值,另一个算法先求最大值再求积,求从上表可以看出,后一个算法的效率明显要高于前一个算法。,数学建模就是把现实世界中的实际问题加以提炼,抽象为数学模型,求出模型的解,验证模型的合理性,并用该数学模型所提供的解答来解释现实问题,我们把数学知识的这一应用过程称为数学建模。,2数学建模的基本方法从分析问题的几种简单的、特殊的情况中,发现一般规律或作出某种猜想,从而找到解决问题的途径。这种研究问题方法叫做归纳法。即归纳法是从简单到复杂,由个别到一般的
34、一种研究方法。,数学模型的应用,杨辉三角形 最大公约数 公倍数 斐波那契数列 特征根求解递推方程,一、杨辉三角形的应用,【例】求n次二项式各项的系数,coeff(int a ,int n) if (n=1) a1=1;a2=1;else coeff(a,n-1);an+1=1;for (i=n;i=2;i- -)ai=ai+ai-1;a1=1; ,二、最大公约数的应用,【例】数组中有n个数据,要将它们顺序循环向后移k位,即前面的元素向后移k位,后面的元素则循环向前移k位,例:1、2、3、4、5循环移3位后为:3、4、5、1、2。考虑到n会很大,不允许用2*n以上个空间来完成此题。,main(
35、) int a100,b100,i,n,k;input(n,k);for(i=0;in;i=i+1)input(ai);for(i=0;in;i=i+1)b(k+i) mod n=ai;for(i=0;in;i=i+1)print(bi); ,时间复杂度:O(n),算法1:无存储空间的限制,开辟两个一维数组,一个存储原始数据,另一个存储移动后的数据。,问题:若kn?如何处理,算法2:使用一个临时存储空间中,main( ) int a100,i,j,n,k,temp;input(n,k);for(i=0;i0;j=j-1)aj=aj-1;a0=temp ;for(i=0;in;i=i+1)pri
36、nt(bi); ,时间复杂度:O(k*n),main( ) int a100,b0,b1,i,j,n,k,m,tt;input(n,k);for(i=0;in;i=i+1) input(ai);m=ff(n,k); /m为n,k的最大公约数for(j=0;jm;j=j+1) b0=aj;tt=j;for(i=0;in/m;i=i+1) tt=(tt+k) mod n;b1=att; att= b0; b0=b1;for(i=0;in;i=i+1) print(ai); ,算法3: 利用一个临时存储空间,把每一个数据一次移动到位:,时间复杂度:O(2*n),三、公倍数的应用,【例】编程完成下面给
37、“余”猜数的游戏: 你心里先想好一个1100之间的整数x,将它分别除以3、5 和7并得到三个余数。你把这三个余数告诉计算机,计算机 能马上猜出你心中的这个数。游戏过程如下:please think of a number between 1 and 100 your number divided by 3 has a remainder of? 1 your number divided by 5 has a remainder of? 0 your number divided by 7 has a remainder of? 5 let me think a moment your num
38、ber was 40,main( ) int a,b,c,d;print( “please think of a number between 1 and 100.”);print( “your number divded by 3 has a remainker of”);input(a);print( “your number divded by 5 has a remainker of”);input(b);print( “your number divded by 7 has a remainker of”);input(c);print( “let me think a moment
39、”);for (i=1 ,i105) d=d-105;print( “your number was ”, d);,四、裴波那契数列应用,【例】楼梯上有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编写算法计算共有多少种不同的上楼梯方法。,f(int n) if(n=1) return(1);if(n=2) return(2);return(f(x-1)+f(x-2); ,五、递推关系求解方程,【例】核反应堆中有和两种粒子,每秒钟内一个粒子可以反应产生3个粒子,而一个粒子可以反应产生1个粒子和2个粒子。若在t=0时刻的反应堆中只有一个粒子,求在t时刻的反应堆中粒子和粒子数。,main() i
40、nt n100,m100,t,i;input(t);n0=1; /初始化操作m0=0;for (i=1;i=t;i+) /进行t次递推 ni=mi-1;mi=3 * ni-1 + 2 * mi-1; print(nt); /输出结果print(mt);,算法分析1:此模型的空间需求较小,时间复杂度为O(n),但随着n的增大,所需时间越来越大,即:,数学模型2:设在t时刻的粒子数为f(t),粒子数为g(t),依题可知: g(t)=3f(t -1)+2g(t -1) (1)f(t)=g(t -1) (2)g(0)=0,f(0)=1下面求解这个递归函数的非递归形式由(2)得f(t -1)=g(t-2
41、) (3)将(3)代入(1)得g(t)=3g(t -2)+2g(t-1) (t2) (4)g(0)=0,g(1)=3(4)式的特征根方程为:x22x3=0其特征根为x1=3,x2= -1,所以该式的递推关系的通解为 g(t)=C13t+C2( -1)t 代入初值g(0)=0,g(1)=3得 C1+C2=0 3C1C2=3 解此方程组所以该递推关系的解为g(t)=即,main() int t,i;input(t); n=int(exp(t*ln(3);m=int(exp(t+1)*ln(3);if (t mod 2=1) n=n-3; m=m+3;else n=n+3; m=m-3;n=int(n/4); / 4|n m=int(m/4); / 4|mprint(n);print(m);,