函数的定义与调用、递归
3.6函数文件的定义与调用
函数文件的基本结构
函数调用
匿名函数
1. 函数文件的基本结构
function 输出形参表=函数名(输入形参表) //function定义一个函数
注释说明部分
函数体语句
当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
TIP:
函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名。
return语句表示结束函数的执行。通常,在函数文件中也可以不使用return语句,那么被调用函数执行完成后会自动返回。
例1 编写函数文件,求半径为r的圆的面积和周长。
function [s,p]=fcircle(r) //方括号括起来 函数名为fciecle 形参为r
s=pi*r*r;
p=2*pi*r;
2. 函数调用
调用格式:
[输出实参表]=函数名(输入实参表)
在调用函数时,函数输入输出参数称为实际参数,简称实参。
要注意函数调用时,顺序和个数要与形参的一致。先将实参传递给相应的形参。在执行函数的功能。
在MATLAB命令行窗口调用前面定义的fcircle函数。
>> [s,p]=fcircle(10)
s =
314.1593
p =
62.8319
3. 匿名函数
基本格式:
匿名函数输入参数指出定义关于什么函数的匿名参数,如果函数有多个输入参数时,参数之间用逗号分隔。
>> f=@(x,y) x^2+y^2
f =
@(x,y)x^2+y^2
>> f(3,4)
ans = 25
还可以给已经存在的函数定义函数句柄,利用函数句柄来调用函数。
>> h=@sin
h =
@sin
>> h(pi/2)
ans = 1
例题:
第②问的函数文件f2.m。
function f=f2(n)
f=0;
for k=1:n
f=f+k*(k+1); //每次把k*k+1累加到f中去
end
脚本文件mf.m。
f1=@(n) n+10*log(n*n+5);
y1=f1(40)/(f1(30)+f1(20))
y2=f2(40)/(f2(30)+f2(20))
>> mf //运行mf文件,得出两种fn定义得到的y值
y1 = 0.6390
y2 = 1.7662
3.7 函数的递归调用
函数的嵌套调用
函数的递归调用
1.函数的嵌套调用
如果在一个函数的定义中调用了其他函数这就是函数的嵌套调用。
2.函数的递归调用
一个函数调用它自身称为函数的递归调用。
Fact函数中调用fact函数
递归?是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
减少了程序的代码量,但会加大存储空间和时间的开销。
(1)直接递归调用
(2)间接递归调用——嵌套调用其他函数
TIP:在程序中,死循环是不允许的。在函数中需要有使递归终止的语句。
例1 利用函数的递归调用,求n!。
n!本身就是以递归的形式定义的:
函数文件fact.m如下:
function f=fact(n)
if n<=1
f=1;
else
f=fact(n-1)*n; //递归调用求(n-1)!
end
在脚本文件a.m中调用函数文件fact.m,求n!。
s=0;
n=input('Please input n=');
s=fact(n);
disp(s)
在命令行窗口运行命令文件:
>> a
Please input n=3
6
运行过程如下:
递归定义有两个要素:
(1)递归终止条件
(2)是问题向终止条件转化的规则
例2 Fibonacci数列定义如下:
首先建立函数文件ffib.m。
function f=ffib(n)
if n>2
f=ffib(n-1)+ffib(n-2);
else
f=1;
end
建立程序文件test.m。取n=20.
F=[]; //定义空向量
for k=1:20 //20次循环
F=[F,ffib(k)*ffib(k)]; // ffib(k)*ffib(k)追加到F中去,成为一行 有20个元素的平方
end
sum(F)
ffib(20)*ffib(21)
运行结果为:
>> test
ans = 74049690
ans = 74049690