第5章 函数2
高中数学 第5章 三角函数 5.2.1 三角函数的概念讲义 新人教A版必修第一册-新人教A版高一第一

5.2.1 三角函数的概念学习目标核心素养1.借助单位圆理解任意角三角函数(正弦、余弦、正切)的定义.(重点、难点)2.掌握任意角三角函数(正弦、余弦、正切)在各象限的符号.(易错点)3.掌握公式——并会应用.1.通过三角函数的概念,培养数学抽象素养.2.借助公式的运算,提升数学运算素养.1.单位圆在直角坐标系中,我们称以原点O为圆心,以单位长度为半径的圆为单位圆.2.任意角的三角函数的定义(1)条件在平面直角坐标系中,设α是一个任意角,α∈R它的终边与单位圆交于点P(x,y),那么:(2)结论①y叫做α的正弦函数,记作sin α,即sin α=y;②x叫做α的余弦函数,记作cos_α,即cos α=x;③yx叫做α的正切,记作tan_α,即tan α=yx(x≠0).(3)总结yx=tan α(x≠0)是以角为自变量,以单位圆上点的纵坐标或横坐标的比值为函数值的函数,正切函数我们将正弦函数、余弦函数、正切函数统称为三角函数.3.正弦、余弦、正切函数在弧度制下的定义域三角函数定义域sin αRcos αRtan α⎩⎪⎨⎪⎧⎭⎪⎬⎪⎫x ∈R ⎪⎪⎪x ≠k π+π2,k ∈Z4.正弦、余弦、正切函数值在各象限内的符号 (1)图示:(2)口诀:“一全正,二正弦,三正切,四余弦”. 5.公式一1.sin(-315°)的值是( ) A .-22 B .-12 C.22 D.12C [sin(-315°)=sin(-360°+45°)=sin 45°=22.] 2.已知sin α>0,cos α<0,则角α是( ) A .第一象限角 B .第二象限角 C .第三象限角D .第四象限角B [由正弦、余弦函数值在各象限内的符号知,角α是第二象限角.] 3.sin 253π=________.32[sin 253π=sin ⎝ ⎛⎭⎪⎫8π+π3=sin π3=32.] 4.角α终边与单位圆相交于点M ⎝⎛⎭⎪⎫32,12,则cos α+sin α的值为________. 3+12 [cos α=x =32,sin α=y =12, 故cos α+sin α=3+12.]三角函数的定义及应用[探究问题]1.一般地,设角α终边上任意一点的坐标为(x ,y ),它与原点的距离为r ,则sin α,cos α,tan α为何值?提示:sin α=y r ,cos α=x r ,tan α=y x(x ≠0).2.sin α,cos α,tan α的值是否随P 点在终边上的位置的改变而改变?提示:sin α,cos α,tan α的值只与α的终边位置有关,不随P 点在终边上的位置的改变而改变.【例1】 (1)已知角θ的终边上有一点P (x,3)(x ≠0),且cos θ=1010x ,则sin θ+tan θ的值为________.(2)已知角α的终边落在直线3x +y =0上,求sin α,cos α,tan α的值. [思路点拨] (1)依据余弦函数定义列方程求x → 依据正弦、正切函数定义求sin θ+tan θ (2)判断角α的终边位置→分类讨论求sin α,cos α,tan α(1)310+3010或310-3010 [因为r =x 2+9,cos θ=x r ,所以1010x =xx 2+9. 又x ≠0,所以x =±1,所以r =10. 又y =3>0,所以θ是第一或第二象限角.当θ为第一象限角时,sin θ=31010,tan θ=3,则sin θ+tan θ=310+3010.当θ为第二象限角时,sin θ=31010,tan θ=-3,则sin θ+tan θ=310-3010.](2)[解] 直线3x +y =0,即y =-3x ,经过第二、四象限,在第二象限取直线上的点(-1,3),则r =(-1)2+(3)2=2,所以sin α=32,cos α=-12,tan α=-3; 在第四象限取直线上的点(1,-3),则r =12+(-3)2=2, 所以sin α=-32,cos α=12,tan α=- 3.1.将本例(2)的条件“3x +y =0”改为“y =2x ”其他条件不变,结果又如何? [解] 当角的终边在第一象限时,在角的终边上取点P (1,2),由r =|OP |=12+22=5,得sin α=25=255,cos α=15=55,tan α=21=2. 当角的终边在第三象限时,在角的终边上取点Q (-1,-2), 由r =|OQ |=(-1)2+(-2)2=5,得: sin α=-25=-255,cos α=-15=-55,tan α=-2-1=2.2.将本例(2)的条件“落在直线3x +y =0上”改为“过点P (-3a,4a )(a ≠0)”,求2sinα+cos α.[解] 因为r =(-3a )2+(4a )2=5|a |, ①若a >0,则r =5a ,角α在第二象限,sin α=y r =4a 5a =45,cos α=x r =-3a 5a =-35,所以2sin α+cos α=85-35=1.②若a <0,则r =-5a ,角α在第四象限, sin α=4a -5a =-45,cos α=-3a -5a =35,所以2sin α+cos α=-85+35=-1.由角α终边上任意一点的坐标求其三角函数值的步骤: (1)已知角α的终边在直线上时,常用的解题方法有以下两种:①先利用直线与单位圆相交,求出交点坐标,然后再利用正、余弦函数的定义求出相应三角函数值.②在α的终边上任选一点P (x ,y ),P 到原点的距离为r (r >0).则sin α=y r,cos α=xr.已知α的终边求α的三角函数时,用这几个公式更方便.(2)当角α的终边上点的坐标以参数形式给出时,一定注意对字母正、负的辨别,若正、负未定,则需分类讨论.三角函数值符号的运用【例2】 (1)已知点P (tan α,cos α)在第四象限,则角α终边在( ) A .第一象限 B .第二象限 C .第三象限D .第四象限(2)判断下列各式的符号:①sin 145°cos(-210°);②sin 3·cos 4·tan 5.[思路点拨] (1)先判断tan α,cos α的符号,再判断角α终边在第几象限. (2)先判断已知角分别是第几象限角,再确定各三角函数值的符号,最后判断乘积的符号.(1)C [因为点P 在第四象限,所以有⎩⎪⎨⎪⎧tan α>0,cos α<0,由此可判断角α终边在第三象限.](2)[解] ①∵145°是第二象限角, ∴sin 145°>0,∵-210°=-360°+150°, ∴-210°是第二象限角, ∴cos(-210°)<0, ∴sin 145°cos(-210°)<0.②∵π2<3<π,π<4<3π2,3π2<5<2π,∴sin 3>0,cos 4<0,tan 5<0, ∴sin 3·cos 4·tan 5>0.判断三角函数值在各象限符号的攻略:(1)基础:准确确定三角函数值中各角所在象限; (2)关键:准确记忆三角函数在各象限的符号;(3)注意:用弧度制给出的角常常不写单位,不要误认为角度导致象限判断错误. 提醒:注意巧用口诀记忆三角函数值在各象限符号.1.已知角α的终边过点(3a -9,a +2)且cos α≤0,sin α>0,则实数a 的取值X 围是________.-2<a ≤3 [因为cos α≤0,sin α>0,所以角α的终边在第二象限或y 轴非负半轴上,因为α终边过(3a -9,a +2),所以⎩⎪⎨⎪⎧3a -9≤0,a +2>0,所以-2<a ≤3.]2.设角α是第三象限角,且⎪⎪⎪⎪⎪⎪sin α2=-sin α2,则角α2是第________象限角.四 [角α是第三象限角,则角α2是第二、四象限角, ∵⎪⎪⎪⎪⎪⎪sin α2=-sin α2,∴角α2是第四象限角.]诱导公式一的应用【例3】 求值:(1)tan 405°-sin 450°+cos 750°; (2)sin 7π3cos ⎝ ⎛⎭⎪⎫-23π6+tan ⎝⎛⎭⎪⎫-15π4cos 13π3.[解](1)原式=tan(360°+45°)-sin(360°+90°)+cos(2×360°+30°) =tan 45°-sin 90°+cos 30° =1-1+32=32. (2)原式=sin ⎝ ⎛⎭⎪⎫2π+π3cos ⎝ ⎛⎭⎪⎫-4π+π6+tan ⎝ ⎛⎭⎪⎫-4π+π4·cos ⎝ ⎛⎭⎪⎫4π+π3=sin π3cos π6+tan π4cos π3=32×32+1×12=54.利用诱导公式一进行化简求值的步骤(1)定形:将已知的任意角写成2k π+α的形式,其中α∈[0,2π),k ∈Z . (2)转化:根据诱导公式,转化为求角α的某个三角函数值. (3)求值:若角为特殊角,可直接求出该角的三角函数值.3.化简下列各式:(1)a 2sin(-1 350°)+b 2tan 405°-2ab cos(-1 080°);(2)sin ⎝⎛⎭⎪⎫-11π6+cos 125π·tan 4π. [解](1)原式=a 2sin(-4×360°+90°)+b 2tan(360°+45°)-2ab cos(-3×360°) =a 2sin 90°+b 2tan 45°-2ab cos 0° =a 2+b 2-2ab =(a -b )2.(2)sin ⎝ ⎛⎭⎪⎫-116π+cos 125π·tan 4π=sin ⎝⎛⎭⎪⎫-2π+π6+cos 25π·tan 0=sin π6+0=12.1.三角函数的定义的学习是以后学习一切三角函数知识的基础,要充分理解其内涵,把握住三角函数值只与角的终边所在位置有关,与所选取的点无关这一关键点.2.诱导公式一指的是终边相同角的同名三角函数值相等,反之不一定成立,记忆时可结合三角函数定义进行记忆.3.三角函数值在各象限的符号主要涉及开方,去绝对值计算问题,同时也要注意终边在坐标轴上正弦、余弦的符号问题.1.思考辨析(1)sin α表示sin 与α的乘积.( )(2)设角α终边上的点P (x ,y ),r =|OP |≠0,则sin α=y r,且y 越大,sin α的值越大.( )(3)终边相同的角的同一三角函数值相等.( ) (4)终边落在y 轴上的角的正切函数值为0.( )[提示](1)错误.sin α表示角α的正弦值,是一个“整体”.(2)错误.由任意角的正弦函数的定义知,sin α=y r.但y 变化时,sin α是定值. (3)正确.(4)错误.终边落在y 轴上的角的正切函数值不存在. [答案](1)× (2)× (3)√ (4)×2.已知角α终边过点P (1,-1),则tan α的值为( ) A .1 B .-1 C.22D .-22B [由三角函数定义知tan α=-11=-1.]3.在平面直角坐标系xOy 中,角α与角β均以Ox 为始边,它们的终边关于x 轴对称,若sin α=15,则sin β=________.-15 [设角α的终边与单位圆相交于点P (x ,y ), 则角β的终边与单位圆相交于点Q (x ,-y ), 由题意知y =sin α=15,所以sin β=-y =-15.]4.求值:(1)sin 180°+cos 90°+tan 0°. (2)cos 25π3+tan ⎝ ⎛⎭⎪⎫-15π4.[解](1)sin 180°+cos 90°+tan 0°=0+0+0=0. (2)cos 25π3+tan ⎝ ⎛⎭⎪⎫-15π4=cos ⎝ ⎛⎭⎪⎫8π+π3+tan ⎝ ⎛⎭⎪⎫-4π+π4=cos π3+tan π4=12+1=32.。
贝塞尔函数详细介绍(全面)

y x 1J m (x) x J m (x)
y 1x 2 Jm (x) x 1Jm (x) x 1Jm (x) x 2 Jm(x)
x 2 Jm(x) 2x 1Jm (x) 1 x 2 Jm (x)
x 2 Jm(x) 2x 1Jm (x) 1x 2 Jm (x)
xnYn1(x)
d
dx
xnYn (x)
x
Y n n1
(
x)
Yn1 ( x)
Yn1 ( x)
2n x
Yn
(x)
Yn1(x) Yn1(x) 2Yn(x)
例1 求下列微积分
(1)
d dx
J0
(
x)
J 0
(x)
J1(x)
(2)
J0(x)
1 x
J0(x)
J1(x)
1 x
J1(x)
1 2
J
0
(x)
1 2 x
x 1Jm (x) x Jm (x)
2
2
m2 x2
x
J
m
(x)
x 2 Jm(x) x 1Jm (x) x2 2 m2 x 2 Jm (x)
x 2 x2 2 Jm(x) xJm (x) x2 2 m2 Jm (x)
x2 t 2Jm(t) tJm (t) t 2 m2 Jm (t)
J
(x)
y AJn (x) BYn (x)
数学物理方程与特殊函数
x2 y xy x2 n2 y 0
J
n
(
x)
m0
(1)m m!(n m
1)
x 2
n2m
Yn
(
x)
lim
n
第5章 函数

第5章函数及其应用5.1 函数种类5.1.1 命令函数,例如:getchar(),putchar()等。
5.1.2标准C++库函数,fabs(), pow(), rand(),sin(x), sqrt(), fexp()等,要使用头文件。
5.1.3自定义函数5.2 自定义函数的概念及使用方法例1:求两个数中的最大数#include <iostream.h>int imax (int a, int b){return (a>b ? a:b); }void main(){int a=6,b=9;cout<<"max="<<imax(a,b)<<endl;}例2:求x的n次方#include "iostream.h"main(){ float mpow(float a,int n);cout<<"pow="<<mpow(3.,3)<<endl;}float mpow(float a,int n){int i;float k=1;for(i=1;i<=n;i++)k=k*a;return (k); }5.3 自定义函数的三种形式5.3.1 无参函数,例如main(),getchar()等。
主函数与子函数之间不传输数据例:输出字符四方形************************************************void print(){int i;for(i=1;i<5;i++)cout<<(“************\n”;}5.3.2. 空函数例:null(){ }5.3.3. 有参函数如例1,例2说明:1.C++语言程序由一个主函数和若干个子函数(模块)组成。
1.子函数也有类型和函数值。
2.子函数程序体可以作为单独的文件存放,如果单独存放,应在主函数中作为头文件进行说明。
第5章 函数

oop技术:封装性、继承性、多态性。
多态性 :一个名字,多个人口”,或称“同一接口, 多种方法 。
例5.6 重载绝对值函数
int abs(int x)
{ { { return x>0?x:-x;} return x>0?x:-x;} return x>0?x:-x;} double abs(double x) 1ong abs(1ong x) void main()
形参带值后,即可进行相应的数据处理
如果有结果值,通过return语句带回到主函数
5.2 函数的调用
函数要先定义,后调用。
调用函数时要考虑到函数本身的参数;
调用标准库函数时,要包含相应的头文件 输入/输出函数 iostream.h 字符串函数 string.h 常用数学函数 math.h 调用自定义函数时,要定义相应的实参,并给 这些实参赋值。
main()
{ int a = 1,b = 2; cout << "Before exchange:a= " << a << ",b= " << b << endl;
swap(a,b);
cout << "After exchange:a= " << a << ",b= " << b << endl; }
例5.8 定义一个求两数最大值的模板函数。
template <class T> T Max(T a, T b) { return a>b?a:b; }
void main()
第五章多元函数微分学

第五章多元函数微分学知识点拔5.1 多元函数的概念一、二元函数的概念1、二元函数的定义设在某一变化过程中,有三个变量x, y和z,如果对于变量x, y在某一范围D内任取一对数值,按照一定的对应法则,总有一个确定的值z与它对应,则称变量z是变量x,y的二元函数,记作:z f (x, y)或z z(x, y),其中x, y称为自变量,z称为因变量或称为x, y的二元函数,变量x, y取值范围D称为该函数的定义域.2、二元函数的几何意义二元函数z f (x, y)在几何上一般表示空间直角坐标系中的一个曲面•二、二元函数的极限1、二元函数极限的定义设二元函数z f(x,y)在点P o(x o,y o)的某去心邻域内有定义,如果动点P(x,y)在该邻域内以任何方式无限地趋于点P0(x o,y。
)时,函数f (x,y)总是无限地趋于一个常数A,则称A是函数z f (x, y)在P(x, y)趋于P o(X o,y o)时的极限(也称二重极限) ,记作lim f (x, y) A或x X oy y o lim f (x, y) A,若记点P(x, y)与点P o(X o,y o)之间的距离为(x,y) (x o,y o)| PP) | .. (x X o)2(y y o)2,则有lim o f (x, y) A •注释:(1)极限的几何意义:当P(x,y)在P o(x o,y o)附近的某个范围内变化时,函数值f (x,y)与常数A的距离恒小于任意给定的正数;(2)二元函数极限存在是指:动点P必须以任意方式趋于点P o时,f (x, y)都无限趋于常数A,则二元函数的二重极限存在,但即使动点P沿过P o的无穷多条路径趋于P o时极限都等于例1求下限极限\17 1mooH X y2X os ( clim 2 x 0 x 2 y 0 x(3)lim0-^x L1 ~~r~ xlim 丄厂1;0xy(x y 2)(1)令r cosrsin,则0,0时,x 2lim^x 0 y 02y 2)1 (x cos(x 2y 2) 2…2)3/2 limr 0r 2(1 sin 2)(1 3 rcosr 2)r 2(1 .2sin limr 02 2)专 1lim 2 r 0r 3(1・2sin),因1sin 2 2,所以 lim r 3(1r 0.2sin0,故原极限 0.(2)由于2x y 2 2x y1 12x,而y 0 20,所以根据夹逼定理,得A ,也不能说明P P o 时,f(x,y) A(3)二元函数极限不存在的判定方法:如果当点P(x, y)以两种不同的方式趋于点F 0(x 0,y 0)时,函数f(x,y)分别趋于不同的常数,则可以断定函数2f(x,y) : 丫2,当动点沿无穷多条直线yx y2、二重极限不存在的判定方法当点P 沿两种不同的路径趋于定点 P 0时,极限存在但不相等或沿某条路径点P 趋于P 0点极限不存在时,则二重极限不存在3、求二元函数极限的常用方法求二元函数极限(即二重极限)的方法有:(1 )利用函数连续的定义及初等函数的连续性;(3)利用有界函数与无穷小量乘积的性质;o(0,0)时其二重极限不是0,因为当P 沿曲线yx 2趋于点 o(0,0)时,f(x, y)f(x, y)在点P °(X 0, y °)处的极限不存在。
《C语言程序设计》教案 第五章 函数

讲课进程和时间分配:
(1)指针、数组和函数的配合使用典型例题分析(40分钟);
(2)变量的作用域分析,变量的存储分类(15分钟);
(3)函数的嵌套调用(30分钟)
(4)习题布置和下一节内容提要(1分钟)
讨论、思考题、作业:
实验指导书习题
参考资(含参考书、文献等):
难点:函数的传址调用。
讲课进程和时间分配:
(1)数组名作为函数参数的典型例题分析(30分钟);
(2)指针作为函数参数时的典型例题分析(40分钟);
(3)学生练习(15分钟)
(4)总结、习题布置和下一节内容提要(5分钟)
讨论、思考题、作业:
实验指导书习题
参考资料(含参考书、文献等):
叶斌陈世强. C语言程序设计.北京:科学出版社
2
授课时间
教学目的和要求(分掌握、熟悉、了解三个层次):
3.熟练掌握变量的作用域和存储类别的知识;
4.掌握指针和数组与函数的配合使用;
5.掌握函数的嵌套调用。
教学内容(包括基本内容、重点、难点):
基本内容:指针和数组作为函数参数;变量作用域和存储类别;函数的嵌套调用;
重点:函数的使用方法、函数的嵌套调用;
重点:函数定义方法、函数调用方法、函数参数传递方法、返回值的使用和类型确定;
难点:函数调用方法、函数参数传递方法。
讲课进程和时间分配:
(1)模块化程序结构的概念、C语言程序结构回顾(5分钟);
(2)函数调用简单例子分析(10分钟);
(3)函数的定义方法(三种有参、无参、空函数)(10分钟)
(4)函数参数和函数值(参数传递方法、参数类型对应关系、函数返回值的含义、返回值的类型等)(20分钟)
C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }
第五章 消费函数与投资函数

NL——寿命(生活年数) NL——寿(生活年数) ——寿命如考虑财产收入WR
消费函数
C = a·WR+ c·YL
a——财产的边际消费倾向 一辈子的消费=一辈子的财富(财产+收入)
三、持久收入的消费理论
持久收入 Yp = θY+(1-θ)Y-1
预期以后的收入是当前收入与过去收入的加权平均数
消费函数
终身收入工作年数wl年收入yl消费函数wlylnlnl寿命生活年数如考虑财产收入wr消费函数awrcyla财产的边际消费倾向一辈子的消费一辈子的财富财产收入三持久收入的消费理论持久收入1预期以后的收入是当前收入与过去收入的加权平均数消费函数政策含义短期收入变化对消费的影响很有限
第五章消费函数理论与投资支出理论
C = cYp
政策含义——短期收入变化对消费的影响很有限。
5-2.投资支出
一、资本投入量的均衡条件
资本收入=总租用成本 设社会总产量水平为Y 合意的资本存量为K’ 则 其中 K’·rc = a ·Y a——资本收入系数 租用成本rc
二、投资支出
厂商从现有资本存量向合意资本存量的调整
投资支出
I = λ(K’- K-1)= λ(aY/rc - K-1)
5-1.消费函数 5-2.投资支出
5-1.消费函数
一、相对收入消费理论
短期消费函数 C=C0+cY C=βY
长期消费函数
“棘轮效应”——上去容易下来难 “示范效应”——从众 收入越高消费也会相应提高,消费占收入的比例减少
C C=C0+cY
C=βY
Y
二、生命周期的消费理论
把收入均匀地用于整个生命过程的消费,预期的终身收入 越多,则平均每年消费也将越多。 工作年数WL ·年收入 年收入YL 终身收入 = 工作年数WL ·年收入YL 消费函数 (WL·YL) C= (WL·YL)/NL
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17
递归函数
递归方法的基本原理 – 将复杂问题逐步化简,最终转化为一个最简单的问
题 – 最简单问题的解决,就意味着整个问题的解决
递归调用应该能够在有限次数内终止递归 – 递归调用如果不加以限制,将无数次的循环调用 – 必须在函数内部加控制语句,只有当满足一定条件
时,递归终止 – 有时将其称为条件递归
退出语句块时释放内存,不再有效
– 并列语句块各自定义的同名变量互不干扰
31
全局变量
全局变量 – 在所有函数之外定义的变量 特点 – 在程序中定义它的位置以后都有效 – 在定义点之前或在其他文件中引用,应该进行如下声明:
extern 类型名 变量名;
– 从程序运行起即占据内存,程序运行过程中可随时访问,
15
例9.1求整数n的阶乘n!
#include <stdio.h> long fact(long n); main() { int n; long result; printf("Input n: "); scanf("%d", &n); result = fact(n); if(result==-1) printf("n<0,data error ! \ n"); else printf("%d! = %ld\n", n, result); }
18
递归函数
任何一个递归调用程序必须包括两部分 – 递归循环继续的过程 – 递归调用结束的过程
if (递归终止条件成立) return 递归公式的初值; else return 递归函数调用返回的结果值;
19
递归函数
思考:下面程序有什么问题 阶乘函数的递归实现
unsigned long Fac(unsigned int n) { if (n < 0) printf("data error!"); else if (n==0 || n==1) 如果某个函数需要返 return 1; 回值的话,那么一定 else 要确保该函数中的所 return n * Fac(n-1); 有控制分支都有返回 } 值。 编译这个程序也会给出警告,提示“非所有控制分支都有返回值”。 同时,运行程序后如果我们输入了一个负数,那么程序运行结果为: Input a:-1↙ Input data error! a! = 11
20
关于代码风格问题
缩进(indent)—保证代码整洁、层次清晰的主要手段
#include<math.h>
main() {int i; for (i=2;i<100;i++) {if(isprime(i)) printf("%d\t",i); } } int isprime(int n) {int k,i; k=sqrt((double)n); for (i=2;i<=k;i++) {if(n%i==0) return 0;} return 1; }
16
递归法
递归调用过程
执行过程: fact(5) fact(4) fact(3) fact(2) fact(1)
main
fact(5)=5*fact(4)=120 fact(4)=4*fact(3)=24 fact(3)=3*fact(2)=6 fact(2)=2*fact(1)=2 fact(1)=1
7
递归问题的提出
A B C
A→C,A→B,C→B, A→C,B→A,B→C,A→C
n更大些 怎么办?
8
递归问题的提出
第一步:将问题简化。 – 假设A杆上只有2个圆盘,即汉诺塔有2层,n=2。
A B C
9
递归问题的提出
A
B
C
对于一个有 n(n>1)个圆盘的汉诺塔,将n个圆盘分 为两部分:上面的 n-1 个圆盘和最下面的n号圆盘。将 “上面的n-1个圆盘”看成一个整体。 – 将 n-1个盘子从一根木桩移到另一根木桩上 – 将1个盘子从一根木桩移到另一根木桩上
21
关于代码风格问题
良好风格的程序应严格采用梯形层次对应好各层次
int IsPrime(int n) { int k, i; k = sqrt((double)n);
#include <math.h> main() { int i; for (i=2; i<100; i++) { if (IsPrime(i)) printf("%d\t",i); } }
24
对函数接口加以注释说明
/* 函数功能:实现××××功能 函数参数:参数1,表示××××× 参数2,表示××××× 函数返回值: ××××× */ 返回值类型 函数名(参数表) { 函数体 return 表达式; }
25
模块化程序设计方法
什么时候需要模块化? – 某一功能,如果重复实现3遍以上,即应考虑模块化,将
for (i=2; i<=k; i++) { if (n % i == 0) return 0; }
return 1; }
22
程序版式
现在的许多开发环境、编辑软件都支持“自 动缩进” – 根据用户代码的输入,智能判断应该缩进还是反
缩进,替用户完成调整缩进的工作
VC中有自动整理格式功能 – 只要选取需要的代码,按ALT+F8就能自动整理
递归调用(Recursive Call)
11
递归(Recursion)函数
递归函数 – 函数直接或间接调用自己
直接调用方式:
int f(x) { int y,z; …. z=f(x); …… }
12
例9.1求整数n的阶乘n!
计算n!= n *(n-1)*(n-2)*…*1 – 迭代法 – 用递归的方法
10
递归问题的提出
将 n个盘子从一根木桩移到另一根木桩上 问题分解为: – 将 n-1个盘子从一根木桩上移到另一根木桩上 – 将1个盘子从一根木桩移到另一根木桩上 设计一个函数,入口参数为n : – 将 n个盘子从一根木桩移到另一根木桩上 将 n-1个盘子从一根木桩上移到另一根木桩上 – 也要调用这个函数来实现 – 出现了函数调用自己的问题
27
函数设计的原则
函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内 – 1986年IBM在OS/360的研究结果:大多数有错误的函数
都大于500行 – 1991年对148,000行代码的研究表明:小于143行的函数比 更长的函数更容易维护
参数和返回值的规则 – 参数要书写完整,不要省略 – 对函数的入口参数进行有效性检查 – 没有参数和返回值时,用void填充 – 每个函数只有一个入口和一个出口,尽量不使用全局变量 – 尽量少用静态局部变量,以避免使函数具有“记忆”功能
第5章 函数与程序结构
提要
递归 编程风格 变量的作用域、存储类
2
递归问题的提出
“汉诺塔”(Hanoi) – 这是一个必须用递归方法才能解决的问题
– n=64时, 18,446,744,073,709,551,615次 – 1844亿亿次 – 每次1微秒,需要60万年
3
递归问题的提出
13
例9.1求整数n的阶乘n!
#include <stdio.h> main() { int n, i; long result=1; printf("Input n:"); scanf("%d", &n); result = 1; for (i=1; i<=n; i++) result *= i; printf("%d!= %ld", n, result); }
n=3 A B C
A→C,A→B,C→B, A→C,B→A,B→C,A→C
4
递归问题的提出
A B C
A→C,A→B,C→B, A→ C
A→C,A→B,C→B, A→C,B→A,B→C,A→C
6
递归问题的提出
A B C
A→C,A→B,C→B, A→C,B→A,B→C,A→C
14
迭代法
例9.1求整数n的阶乘n!
long fact(long result; n)
{
long
递归法
if (n < 0) return –1; else if (n==0 || n==1) /*递归终止条件*/ return 1; else return (n * fact(n-1));/*递归调用*/ }
它写成通用函数,并向小组成员发布
要尽可能复用其它人的现成模块。
26
模块化程序设计方法
功能分解 – 自顶向下、逐步求精的过程 模块分解的原则 – 保证模块的相对独立性
高聚合、低耦合
– 模块的实现细节对外不可见
外部:关心做什么 内部:关心怎么做
设计好模块接口 – 接口是指罗列出一个模块的所有的与外部打交道的变量等 – 定义好后不要轻易改动 – 在模块开头(文件的开头)进行函数声明
33
#include <stdio.h>
void GlobalPlusPlus(void);
例5.8
main() { int global = 1; printf("Before GlobalPlusPlus(), it is %d\n", global); GlobalPlusPlus(); printf("After GlobalPlusPlus(), it is %d\n", global); } /* 函数功能: 对局部变量global加1,并打印加1之前与之后的值 函数入口参数: 无 Before GlobalPlusPlus(), it is 1 函数返回值: 无 Before ++, it is 1 */ After ++, it is 2 void GlobalPlusPlus(void) After GlobalPlusPlus(), it is 1 { int global = 1; printf("Before ++, it is %d\n", global); global++; printf("After ++, it is %d\n", global); }