function函数嵌套 matlab_MATLAB嵌套函数

嵌套函数的定义

嵌套函数,即nested function,就是嵌套在函数体内部的函数。嵌套函数可以出现在一个函数体内部的任何位置,开始以function声明,结束的时候加上end。需要说明的是包含有嵌套函数的函数,无论它是主函数、子函数、嵌套函数,都应该在末尾的地方加上end。下面的代码是一个简单的嵌套函数的例子

例1

function r=MyTestNestedFun(input)

a=5;

c=sin(input)+tan(input);

function y=nestedfun(b)

y=a*c+b;

end

r=nestedfun(5);

end

>> r=MyTestNestedFun(6)

r =

2.1479

结果是这样得到的:调用MyTestNestedFun后,程序依次执行a=5;c=sin(input)+tan(input);然后又调用nestedfun这个嵌套函数,此时b=5,而嵌套函数所在的函数中的a,c对嵌套函数是可见的。r=a*c+b=5*(-0.5704)+5=2.1479

嵌套函数种类

嵌套函数可以分为单重嵌套函数和多重嵌套函数。先说单重嵌套函数,这样的函数嵌套在别的函数体内,自己内部不再有嵌套的函数。如上例示例。一个函数里可以有一个或者多个单重嵌套函数。

多重嵌套函数,这样的函数嵌套在别的函数体内,同时自己内部又嵌套着别的另一层或几层函数。同样一个函数里可以有一个或者多个多重嵌套函数。如下

例2

function x=A(p1,p2)

...

function y1=B1(p3)

...

function z1=C1(p4)

...

end

...

end

...

function y2=B2(p5)

...

function z2=C2(p6)_

...

function w=D(p7)

...

end

end

end

end

该函数A(p1,p2)内部有两个嵌套函数,分别B1(p3)和B2(p5),而B1(p3)和B2(p5)分别是二重和三重嵌套函数。

嵌套函数的变量作用域

例1

function r=NestedFunctionVarScopeDemo(a)

b=a+1;

function Nested1

c=b+1;

function Nested11

d=c+a;

end

Nested11;

end

Nested1

r=d;

end

运行上面的代码,譬如

r=NestedFunctionVarScopeDemo(1)

r =

4

上述代码有一个二重嵌套函数Nested1,它内部还包含一个嵌套函数Nested11,整个函数的执行过程如下:

传入变量a=1,计算b的值,b=2;遇到Nested1的函数定义,往下是调用Nested1的语句,进入Nested1之后先计算c的值,即c等于b+1=3。从这里可以看到,在嵌套函数体内,可以访问主函数之内的变量。“c=b+1;”这条语句之后是定义Nested11的函数语句,定义Nested11结束后,是调用Nested11的函数语句。从Nested11的定义来看,这个函数非常简单,仅仅做的是计算d=c+a;从这里可以看出在第二重嵌套函数里,分别访问了Nested1里的变量c和主函数里的变量a。主函数最后一句是从外部访问了第二重嵌套函数里的变量d,并将d赋给r,以此作为主函数的返回值。

从上面这个嵌套函数的示例可以看出,主函数和嵌套在其内的函数,它们各自的变量是可以互相访问的。但是必须要注意的是,嵌套函数访问主函数的变量,可以在函数定义里直接拿过来用,而主函数访问嵌套在其内的函数里的变量则必须要经过调用之后才能用。譬如上例主函数访问Nested11里的d,是经过在主函数里调用Nested1,而在Nested1里又调用Nested11后才成功的,否则是不行的。

例2

function r=NestedFunctionVarScopeDemo2(a)

b=a+1;

function Nested1

c=b+1;

c1=10;

function Nested11

d=c+a;

end

end

Nested1

e=c1

r=d;

end

运行得到如下结果

r=NestedFunctionVarScopeDemo2(1)

e =

10

未定义函数或变量 'd'。

出错 NestedFunctionVarScopeDemo2 (line 12)

r=d;

在调用NestedFunctionVarScopeDemo2时候发生了错误。从提示来看,是没有定义变量“d”。这是因为调用Nested1后执行了Nested1里的语句,但是Nested1中只是定义了Nested11,而并没有调用它的语句。因此,外界不能访问d。这就是为什么e=c1;可以成功而r=d;报错的原因了。

上面讨论了嵌套函数和主函数之间变量互相访问的情况(包括主函数也是嵌套函数的情况)。那么不同的嵌套函数之间呢?如下例

例3

function r=NestedFunctionVarScopeDemo3(a)

b=a+1;

function Nested1

c=b+1;

c1=10;

Nested2;

c2=d^2;

end

function Nested2

d=2*b;

end

Nested1

r=c2

end

该函数里面包含两个嵌套函数,都是单重的,一个是Nested1,一个是Nested2。本例是想验证,是否直接从Nested1中通过调用Nested2来访问其中的变量。经过运行得到下面的结果:

>> r=NestedFunctionVarScopeDemo3(1)

未定义函数或变量 'd'。

出错 NestedFunctionVarScopeDemo3/Nested1 (line 7)

c2=d^2;

出错 NestedFunctionVarScopeDemo3 (line 12)

Nested1

从错误提示来看,出错原因是访问变量“d”不成功,“d”未定义,所以彼此没有嵌套关系的嵌套函数是不能简单得共享变量的,如果非要共享,只能通过他们所在的主函数来进行。

嵌套函数彼此调用关系

主函数和嵌套函数之间

这里的主函数包括最上层的主函数,即不嵌套在任何函数里的函数以及本身是嵌套函数,但同时内部还嵌套有其他函数的函数。因为这些函数相对嵌套在内的函数来说也是主函数。这样的情形下,调用关系遵循下面的原则:

主函数可以调用嵌套在其中的第一重嵌套函数而不能调用第二重或者更深重的嵌套函数;无论第几重嵌套函数,都可以调用主函数或者主函数的主函数等等

如下例

function r=NestedFunctionCallDemo1(a)

b=a+1;

function c1=Nested1(x)

c=b+1;

c1=10+c*x;

function d=Nested11

d=c+a;

end

end

c1=Nested1(1);

r=Nested11;

end

本例呈现的是主函数调用子函数的例子。又上例可以看出。在主函数NestedFunctionCallDemo1中分别对Nested1和Nested11进行了调用。运行结果如下:

r=NestedFunctionCallDemo1(1)

c1 =

13

未定义函数或变量 'Nested11'。

出错 NestedFunctionCallDemo1 (line 11)

r=Nested11;

从结果来看,调用Nested1成功,而调用Nested11没有成功。这验证了主函数可以调用嵌套在其中的第一重嵌套函数,而不能调用第二重或者更深重的嵌套函数

下例为嵌套函数调用主函数的例子

function NestedFunctionCallDemo2(flag)

switch flag

case 1

disp('flag=1');

return;

case 2

disp('flag=2');

NestedFun1

case 3

disp('flag=3');

return

otherwise

disp(['flag=',num2str(flag)]);

return

end

function NestedFun1

NestedFunctionCallDemo2(1);

NestedFun2

function NestedFun2 NestedFunctionCallDemo2(3)

end

end

end

运行上述代码,得到下面结果

>> NestedFunctionCallDemo2(2)

flag=2

flag=1

flag=3

当flag=2时,执行的是NestedFun1,而在NestedFun1中调用了主函数,这时候flag=1;因此此时显示“flag=1”,接下来在NestedFun1中对NestedFun2进行了调用。而NestedFun2对最外层的主函数来说是一个二重嵌套函数,同样它也调用了NestedFunctionCallDemo2,只不过flag=3,因此显示“flag=3”。从上例可以看出,嵌套函数对主函数的调用是可以的。

不同的嵌套函数之间

这里讨论的不用嵌套函数之间指的是嵌套深度相同或者不同,彼此之间没有嵌套与被嵌套关系的不同的嵌套函数。譬如位于第一层的不同嵌套函数之间,以及位于第二层的不同嵌套函数之间,等等。如下例

嵌套函数调用示例1

function NestedFunctionCallDemo3

Nested1(5)

function Nested1(x)

disp(['Nested1 执行,输入:',num2str(x)]);

Nested2(6)

function Nested11(xx)

disp(['Nested11 执行,输入:',num2str(xx)]);

end

end

function Nested2(y)

disp(['Nested2 执行,输入:',num2str(yy)]);

function Nested22(yy)

disp(['Nested22 执行,输入:',num2str(yy)]);

end

end

end

运行结果如下:

Nested1 执行,输入:5

Nested2 执行,输入:6

从上面结果来看,Nested1执行后成功调用Nested2这说明第一层的嵌套函数之间是可以互相调用的。

嵌套函数调用示例2

function NestedFunctionCallDemo4

Nested1(5)

function Nested1(x)

disp(['Nested1 执行,输入:',num2str(x)])

Nested11(6)

function Nested11(xx)

disp(['Nested11 执行,输入:',num2str(xx)])

Nested2(pi)

Nested22(10);

end

end

function Nested2(y)

disp(['Nested2 执行,输入:',num2str(y)])

Nested22(pi*pi)

function Nested22(yy)

disp(['Nested22 执行,输入:',num2str(yy)])

end

end

end

运行代码,得到

>> NestedFunctionCallDemo4

Nested1 执行,输入:5

Nested11 执行,输入:6

Nested2 执行,输入:3.1416

Nested22 执行,输入:9.8696

未定义函数或变量 'Nested22'。

出错 NestedFunctionCallDemo4/Nested1/Nested11

(line 9)

Nested22(10);

出错 NestedFunctionCallDemo4/Nested1 (line 5)

Nested11(6)

出错 NestedFunctionCallDemo4 (line 2)

Nested1(5)

从上面的执行情况可以看出函数Nested11成功被调用,而且Nested11再调用Nested2时也成功了,通过Nested2,间接调用了Nested22,但是从Nested11中直接调用Nested22却没有成功。说明第二重调用可以调用不包含它的第一重嵌套函数。

嵌套函数调用3

function NestedFunctionCallDemo5

Nested1(5)

function Nested1(x)

disp(['Nested1 执行,输入:',num2str(x)])

Nested11(6)

function Nested11(xx)

disp(['Nested11 执行,输入:',num2str(xx)])

Nested111(pi)

function Nested111(xxx)

disp(['Nested111 执行,输入:',num2str(xxx)]);

Nested2(exp(1))

Nested22(100)

end

end

end

function Nested2(y)

disp(['Nested2 执行,输入:',num2str(y)])

Nested22(pi*pi)

function Nested22(yy)

disp(['Nested22 执行,输入:',num2str(yy)])

end

end

end

运行代码结果为:

Nested1 执行,输入:5

Nested11 执行,输入:6

Nested111 执行,输入:3.1416

Nested2 执行,输入:2.7183

Nested22 执行,输入:9.8696

未定义函数或变量 'Nested22'。

出错

NestedFunctionCallDemo5/Nested1/Nested11/Nested111

(line 12)

Nested22(100)

出错 NestedFunctionCallDemo5/Nested1/Nested11

(line 8)

Nested111(pi)

出错 NestedFunctionCallDemo5/Nested1 (line 5)

Nested11(6)

出错 NestedFunctionCallDemo5 (line 2)

Nested1(5)

从上面的执行情况可以看出,函数Nested1执行后,函数Nested11成功被调用,而且Nested11在调用Nested111,Nested111在调用Nested2时也成功了;通过Nested2,Nested111间接调用了Nested22,但是从Nested111直接调用Nested22却没有成功。这说明第三重嵌套函数,不可以调用不包含它的第二重嵌套函数。

嵌套函数调用关系总结

为了方便理解。可以将上述调用情况进行类比

具体如下

将主函数看成“父亲”,嵌套函数依据嵌套深度可以看成“儿子”,“孙子”,“重孙子”,等等。

父亲可以求助儿子,儿子可以求助父亲。即父子可以互相求助。一个人不能求助孙子,重孙等后代,但是可以求助自己的祖宗(祖父、曾祖父等等)。一个人可以求助自己亲兄弟,或者叔叔、伯伯但不能求助侄儿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 代码复用 —— 泛型

public interface Comparable<T> {public int compareTo(T o); } 1. 接口&#xff08;Comparable&#xff1a;可比较接口&#xff09; public static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0; } 当然也可以将参数中的 Comparable 具化为…

阿里云发布首台云电脑“无影”,传统 PC 已“末路”?

来源 | 硬核编辑部作者 | 硬核云顶宫在9月17日的云栖大会上&#xff0c;阿里云智能总裁、达摩院院长发布阿里云第一台云电脑——“无影”。这是一台长在云上的“超级电脑”&#xff0c;只需将一张名片夹大小的 C-Key 上连接一块屏幕&#xff0c;就可以进入专属云电脑桌面&#…

金星可能存在生命?科学家发现大气中有磷化氢,剧毒气体或是生物代谢产物...

文章来源&#xff1a;量子位最新消息&#xff0c;英国皇家天文学会发布了一条激动人心的新进展&#xff1a;金星上可能存在着生命迹象。因为科学家发现&#xff0c;金星大气中存在着浓度异常的磷化氢(PH3)气体&#xff0c;达到20ppb&#xff08;亿分之二&#xff09;。这种剧毒…

python怎么输入两个数然后求差值_python两个日期之间天差值获取

因为我也刚刚接触python&#xff0c;这个原则上也是百度找到的&#xff0c;原来那位我也找不到了......主要就是使用datetime进行转化然后进行相减&#xff0c;获得如[diff_days] : 00:00:00形式的结果&#xff0c;这里我是把结果转成string去做截取了。需要引入time,datetime两…

php简单的用户留言板实现内容(1-23)

静态模版来源 可视化布局 代码实现 <?php header(content-type:text/html;charsetutf-8); date_default_timezone_set("Asia/Shanghai"); /*构思&#xff1a;建立一个文本文件&#xff0c;通过操作文件&#xff0c;写入数据、读取数据&#xff01;file_get_conte…

3D芯片大脑:在芯片上培养脑细胞,还能用来测试新药

来源&#xff1a;MEMS在科学实验中&#xff0c;研究人员往往首先以小白鼠为实验对象。虽然是科研需要&#xff0c;但有人谴责这是对生命的亵渎。此外&#xff0c;动物测试成本高且耗时&#xff0c;同时无法精确体现人类的反应。那么有没有其他替代品呢&#xff1f;来自劳伦斯利…

mysql install安装报错_mysql安装报错

错误1make: *** No targets specified and no makefile found. Stop.1、wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz2.、tar zxvf ncurses-5.6.tar.gz3、 ./configure -prefix/usr/local -with-shared-without-debug4、make5、make install报错2&#xff1a;I…

Linux中几个实用快捷键

返回上层目录&#xff1a; cd ..命令提示符&#xff1a; userubuntu&#xff1a; 之前的部分为当前用户ID名称&#xff1b; 之后冒号之前是主机名称sudo &#xff1a;&#xff08;Superusers Do&#xff09; 以超级用户执行在相对路径中&#xff0c; . 表示当前目录&#xff0…

68个单位134项 | 2020年国家自然科学基金专项项目立项名单发布

来源&#xff1a;自然科学基金委、青塔9月17日&#xff0c;国家自然科学基金委基金查询系统公布了2020年专项项目立项名单。本年度专项项目共立项134项&#xff0c;来自68个单位。其中&#xff0c;北京大学立项项目数量、金额均最多&#xff0c;共9项&#xff0c;合计资助金额1…

mysql atlas php_Mysql中间件代理 Atlas

本文接上文介绍atlas的安装配置&#xff0c;以及借助keepalive软件实现altas的ha&#xff0c;避免由于atlas故障&#xff0c;导致数据库服务中断的情况出现&#xff1a;一&#xff1a;环境介绍Atlas主&#xff1a;192.168.1.12/# yum -y install openssl openssl-devel# wget h…

灵魂出窍的神经生物学基础!

来源&#xff1a;孙学军科学网博客过量使用氯胺酮&#xff0c;会导致使用者出现幻听幻象&#xff0c;甚至灵魂出窍的感觉。这种灵魂出窍的感觉在学术上被成为分离麻醉&#xff0c;常被描述为感觉脱离现实或有一种“脱离身体”的体验。这种现象不仅见于服用氯胺酮&#xff0c;也…

基于mycat的mysql_基于mycat实现mysql的读写分离

需要具备以下环境1 mysql主从复制2 jdk安装以及环境变量配置以下为我的演示参考&#xff1a;192.168.142.26 master- mysql 具备主从主从复制条件192.168.142.25 slave- mysql 具备主从主从复制条件192.168.142.27 slave- mysql 具备主从主从复制条件192.168.142.28 myca…

linux wget 命令用法详解(附实例说明)

来源&#xff1a;http://www.jb51.net/LINUXjishu/86326.html Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;尤其对于网络管理员&#xff0c;经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟…

uniapp中复选框的使用

当在uniapp中使用复选框时&#xff0c;可以使用<checkbox>组件来实现。首先&#xff0c;在需要添加复选框的页面或组件中引入<checkbox>组件&#xff0c;在需要添加复选框的位置使用<checkbox>标签&#xff0c;并设置相应的属性&#xff0c;比如v-model来绑定…

《WeCity未来城市2.0白皮书》全文发布

全文共计899字60图&#xff0c;预计阅读时间12分钟来源 | 腾讯研究院&#xff08;转载请注明来源&#xff09;编辑 | 石煜倩新基建浪潮之下&#xff0c;新型城镇化的建设正在加速&#xff0c;这为数字技术与经济社会融合带来了更多的想象空间&#xff1b;同时后疫情时代&#x…

bzoj5108 数据_成都day3t3

3 、B B 君的第 三 题 ( shanghai .pas /cpp )【问题描述】日光之下&#xff0c;并无新事。大家还记得 BZOJ1494[NOI2007]生成树计数吗&#xff1f;这个题目就是原版环形的生成树计数。考虑到有些同学没有看过这个题目&#xff0c;我们简述这个题目如下。输入 k, n(n ≥ 2k 1…

20165333 我期望的师生关系

20165333 我期望的师生关系 印象深刻的老师 印象中小学老师的教学模式和方法大都是上课讲课&#xff0c;下课批改作业&#xff0c;一般无二&#xff0c;没有印象深刻的老师。一直记得初中时教我英语的赵老师&#xff0c;那时学校要求每天晚自习前学生上台一分钟演讲&#xff0c…

杨振宁:理论物理的工作是“猜”,而数学讲究的是“证”

文章 | 数学传播来源 | 算法与数学之美杨振宁是当代的大物理学家&#xff0c;又是现代数学发展的重要推动者&#xff0c;他的两项巨大成就: 杨–密尔斯规范场和杨–巴克斯特方程&#xff0c;成为80年代以来一系列数学研究的出发点&#xff0c;其影响遍及微分几何、偏微分方程、…

mysql normsinv_在MySQL中实现NORMSINV函数

我需要在MySQL中使用逆正态累积分布函数(Excel中的是NORMSINV函数),但是那里没有这样的函数.也许你们中的任何一个都为MysqL实现了它&#xff1f;非常感谢您的宝贵时间.最佳答案好吧,我终于找到了这个.它不是完美的,但是很好的替代.该代码不是我的,其作者是Geoffrey C. Barnes.…

档案信息化管理的最好解决方案

21世纪报纸作为信息传递的载体&#xff0c;逐渐被各种新闻类APP所取代&#xff0c;打开APP点击一下就可阅尽天下事。文档内容电子化、信息化可以说是一个潮流趋势&#xff0c;那我们如何将各类大事件、大新闻留档存档&#xff0c;实现更高效地查看管理成为我们值得思考的一个问…