基本程序设计技术.ppt
《基本程序设计技术.ppt》由会员分享,可在线阅读,更多相关《基本程序设计技术.ppt(44页珍藏版)》请在课桌文档上搜索。
1、1,高级语言程序设计,2,第四章基本程序设计技术,3,主要内容:基本程序设计技术,循环程序设计循环与递归基本输入输出控制结构和控制语句程序设计实例程序测试和排错,递归与循环递归函数的执行过程递归函数效率,4,重复性计算可用循环结构完成;有些重复性计算,C中可用递归完成;,例:定义计算整数阶乘的函数:12(n-1)n乘的次数依赖于n,定义时不知道,每次用可能不同。,程序的典型情况:计算“次数”依赖某些参数的值。,4.2循环与递归,5,计算整数阶乘的递推函数,long fact(long n)long i,f=1;for(i=2;i=n;+i)f*=i;return f;,类型特征可定为:int
2、fact(int)阶乘值增长极快(数学),更合适的类型特征:long fact(long),6,1.关于递归定义如果问题本身能用数学递归描述,可用递归定义解决;C允许递归定义:在函数定义内调用被定义函数本身。,求阶乘的数学递归定义公式,7,嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数,函数的嵌套与递归调用,8,定义:函数直接或间接的调用自身叫函数的递归调用,说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x)int y,z;z=f(y);.return(2*z);,
3、递归调用,9,构成递归需具备的条件,子问题须与原始问题为同样的事,且更为简单;不能无限制地调用本身,必须有个出口,化简为非递归状况处理。,10,long fact(long n)return n=0?1:n*fact(n-1);,long fact(long n)long i,f=1;if(n=0)f=1;else f=n*fact(n 1);return f;,求阶乘的递归函数定义1:,求阶乘的递归函数定义2:,递归如何实现?,11,计算中fact被递归调用的次数由实参确定。,考虑负参数值处理。可改为:n=1?1:.,long fact(long n)long i,f;if(n=0)f=1;
4、else f=n*fact(n-1);return f;,12,long fact(1)if(1=1)return 1;return 1*fact(1-1);,long fact(2)if(2=1)return 1;return 2*fact(2-1);,long fact(3)if(3=1)return 1;return 3*fact(3-1);,main()printf(“%d”,fact(3);,蓝线:函数调用线路绿线:函数内部执行路线红线:函数执行结束返回主调函数的路线,long fact(long n)if(n=1)return 1;return n*fact(n-1);,13,例1
5、 阅读源程序,写出运行结果。,#includelong f(int n)long s;if(n=1)|(n=2)s=2;else s=n+f(n 1);return s;,int main()long x;x=f(4);printf(“%ldn”,x);return 0;,结果:9,14,2.递归与计算过程,包含递归的程序产生的计算过程和性质复杂,能完成很复杂的工作。递归调用只有一个调用表达式或语句,但是可能要许多步才能完成。实际参数的不同,会实际产生的递归调用次数(步数)也会有很大的不同。递归程序的理解比较困难递归的函数定义需要有条件语句去控制递归过程的最终结束直接给出结果的时候,递归结束;
6、把对较复杂情况的计算归结为对更简单情况的计算,需要进行递归处理。基本运算、关系判断、条件表达式,加函数定义和递归定义构成了一个(理论上)“足够强的”的程序语言。,15,Fibonacci(斐波那契)序列的递归定义:求第n项Fn,#includelong fib(int);int main()long f;int n=40;f=fib(n);printf(n=%d,f=%ldn,n,f);return 1;long fib(int n)return n2?1:fib(n-1)+fib(n-2);,问题分析:研究程序的执行过程,例:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个
7、月后每月又生一对兔子,假设所有的兔子都不会死,问每个月的兔子总数是多少?112358132134,16,问题:存在大量重复计算,参数越大重复计算越多。,计算fib(10)?fib(3):21次 fib(30)?fib(3):317811次 fib(40)?fib(60)?.,long fib(int n)return n2?1:fib(n-1)+fib(n-2);,17,3.为计算过程计时统计程序/程序片段的计算时间有助于理解程序性质。许多语言或系统都提供了内部计时功能。,有关函数在time.h,统计程序时间时程序头部应写:#include在程序里计时,通常写表达式:clock()/CLOCK
8、S_PER_SEC得到从程序开始到表达式求值时所经历的秒数。注意:有些老的C系统(如Turbe-C)用 CLK_TCK。,18,#include#includelong fib(int n)return n=1?1:fib(n 1)+fib(n 2);int main()double x;x=clock()fib(45);x=(clock()-x)/CLOCKS_PER_SEC;printf(Timing fib(45):%f.n,x);return 0;/*计算需210s*/,确定计算fib(45)所需要的时间的程序:,19,Fibonacci数的递推计算前n项,第01n-1项1)F0和F1
9、是12)知道连续两个Fibonacci数,就可算出下一个递推计算方式:逐个前推,可用循环实现:,1 1235第一次f0+f1 f2 第二次 f0+f1 f2第三次 f0+f1 f2,20,void fib1(int n)long f0,f1,f2;int i;f0=f1=1;printf(%ld%ld,f0,f1);for(i=2;i n;i+)f2=f0+f1;f0=f1;f1=f2;printf(%ld,f);if(i%5=0)printf(n);,#includevoid fib1(int);int main()int n=45;fib1(n);return 0;,Fibonacci数的
10、递推计算前n项,一次计算一个数,21,#includevoid fib1(int);int main()int n=45;fib1(n);return 0;,Fibonacci数的递推计算前n项,一次计算二个数 f0=1;f1=1;f0=f0+f1;f1=f1+f0;n为偶数算出n个数,n为奇数算出n+1个数;,void fib1(int n)long f0,f1;int i;f0=f1=1;printf(f(%d)=t%ldt,0,f1);printf(f(%d)=t%ldn,1,f2);for(i=2;i n;i=i+2)f0=f0+f1;f1=f1+f0;printf(f(%d)=t%l
11、dt,i,f0);printf(f(%d)=t%ldt,i+1,f1);if(i%2=0)printf(n);,22,Fibonacci数列的递归及非递归算法,/求Fibonacci数列非递归算法#include void fib1(int n)long f0,f1,f2;int i;f0=f1=1;printf(%ld%ld,f0,f1);for(i=2;i n;i+)f2=f0+f1;f0=f1;f1=f2;printf(%ld,f);if(i%5=0)printf(n);int main()int n=45;fib1(n);return 0;,/求Fibonacci数列递归算法#incl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 程序设计 技术

链接地址:https://www.desk33.com/p-248039.html