资源描述
,单击以编辑母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八章 过程,8.2 Function,函数定义及调用,8.4,递归过程,8.3,参数的传递,8.1 SUB,过程及其调用,8.5,变量的作用域,8.6,程序示例,8.7,实验,8.4,递归过程,递归的概念,用自身的结构来描述自身称为“递归”即一个过程调用过程本身,在递归调用中,一个过程执行的某一步要用到它自身的上一步或上几步的结果。例如:最典型的例子是对阶乘运算可作如下定义:,n!=n*(n-1)!,(n-1)!=(n-1) *(n-2)!,Sub f1(x),x=f2(xx)*3,End Sub,Sub Command1_Click(),Call f1(y),End Sub,Function f2(x),f2=f3(x)+3,End Sub,Function f3(x),f3=x*x,End Sub,Sub f1(x),Call f1(y),End Sub,过程的嵌套调用,Sub Command1_Click(),Call f1(y),End Sub,过程的递归调用,8.4,递归过程,递归有两种,直接递归:自己调用自己,间接递归:,A,调用,B,,,B,调用,A,递归过程中必须有递归结束语句。,递归子过程和递归函数,VB,允许一个子过程或函数在自身定义的内部调用自己,这样的子过程或函数称为,递归子过程,或,递归函数,。许多问题中具有递归的特性,用递归调用描述它们就非常方便。,注意:递归过程必须有一个结束递归的终止条件,否则会无限制的执行下去。,8.4,递归过程,例,7,、 求,fac(n,)=n!,的值,(,n,已,4,为例),递推,fac(4)=4*fac(3),fac(3)=3*fac(2),fac(2)=2*fac(1),fac(1)=1,fac(2)=2*1,fac(3)=3*2,fac(4)=4*6,回归,8.4,递归过程,Public Function,fac(n,As Integer) As Integer,If n=1 Then,fac,=1,Else,fac,=n*fac(n-1),End If,End Function,Private Sub Command1_Click(),Print “fac(4)=“; fac(4),End Sub,递归调用,演示,8.4,递归过程,1,、求阶乘。,n!=n*(n-1)!,2,、,求菲波那契数列前,10,项。,F(1)=1,,,F(2)=1,,,后面各项满 足:,F(n)=F(n-1)+F(n-2),3,、,求两个数的最大公约数。,4,、,逆转输出一个字符串。,5,、,汉诺塔游戏。,相关习题:,8.5,变量的作用域,变量的作用域,过程的作用域,静态变量,同名变量,8.5,变量的作用域,应用程序,(.,vbp,文件,),类,模块,(.,cls,),文件,一个或若干个窗体,模块,(*.,frm,),文件,用户自定义子过程,(Sub),用户自定义函数过程,(Function),事件过程,(Sub),用户自定义子过程,(Sub),用户自定义函数过程,(Function),一个或若干个标准,模块,(*.bas),文件,全局级,模块级,过程级,8.5.1,变量的作用域,1.,局部变量,作用域为定义的过程内。指在,过程内,用,Dim,语句声明的变量(或不加声明直接使用的变量),只能在本过程中使用,,别的过程不可访问,。局部变量随过程的调用而分配存储单元,并进行变量的初始化,一旦该过程体结束,变量的内容,自动消失,,占用的存储单元释放。不同的过程中,可有相同名称的变量,,彼此互不相干。使用局部变量有利于程序的调试,如,Dim b as string,8.5.1,变量的作用域,2.,窗体,/,模块级变量,作用域为定义的窗体,/,模块内。指在一个窗体,/,模块的任何过程外,即在,“通用声明”,段中用,Dim,语句,或用,Private,语句声明的变量,可被本窗体,/,模块的,任何过程访问。,如,Dim c as string,8.5.1,变量的作用域,3.,全局变量,作用域为,整个应用程序,内。指在窗体或标准模块的任何过程或函数外,即在“通用声明”段中用,Public,语句声明的变量,可被应用程序的任何过程或函数访问。全局变量的值在整个应用程序中始终不会消失和重新初始化,只有当整个应用程序结束时,才会消失。,4,、例题,如,Dim a as string,8.5.1,变量的作用域,演示,8.5.2,过程的作用域,1.,窗体,/,模块级,指在某个窗体或标准模块内定义的过程,定义子过程或函数时前加,Private,关键字,过程只能被本窗体或本标准模块中的过程调用,8.5.2,过程的作用域,2,、全局级,指在窗体或标准模块中定义的过程,其默认是全局的,也可加,Public,进行说明。全局级过程可供该应用程序的所有窗体和所有标准模块调用,调用方式有如下两种:,在窗体定义的过程,外部过程调用时,必须加窗体名,在标准模块定义的过程,外部过程均可调用,但过程名必须唯一,否则要加标准模块名,8.5.3,静态变量,每次调用过程时,用,Static,说明的变量保持原来的值,而用,Dim,说明的变量,每次调用过程时,都重新初始化。,形式如下:,Static,变量名,As,类型,Static Function,函数名,(,参数列表,)As,类型,Static Sub,过程名,(,参数列表,),8.5.3,静态变量,Private Sub Command1_Click(),Dim k As Integer,k = 5,Call,ss(k,),Print k,:,k = 5,Call,ss(k,),Print k,End Sub,Private Sub,ss(ByRef,n As Integer),Static,sta,As Integer,sta,= n +,sta,:,n = n +,sta,End Sub,运行结果:,第一次调用:,K=10,第二次调用:,K=15,演 示,8.5.4,同名变量,变量的作用域不同时,名字可以相同,但在使用时如果不在本模块内,则必须加上变量所在模块的模块名。,同名变量的引用,a.,不同模块的全局变量同名:,在本模块中:直接用变量名引用。,在外模块中:模块名,.,变量名,b.,同一模块的全局变量与局部变量同名:,在过程内:只能引用局部变量(用变量名)。,在过程外:只能引用全局变量(用变量名)。,c.,同一模块的模块级变量与局部变量同名,在过程内:用变量名引用局部变量,在过程外:用变量名引用模块级变量。,8.6,程序示例,逆序输出,求,反正弦,最大公约数,直接插入,运动员名次,示例,实 验,1,、实验指导书,P,93,实验,11-1,2,、实验指导书,P,101,实验,11-6,3,、实验指导书,P,101,实验,11-8,4,、实验指导书,P,101,实验,11-9,5,、实验指导书,P,104,实验,12-1,6,、实验指导书,P,107,实验,12-3,7,、实验指导书,P,110,实验,12-6,8,、求方程,ax,2,+bx+c=0,的根,用,3,个函数分别求当,b-4ac,大于,0,、等于,0,和小于,0,时的根,并输出结果,要求从主函数输入,a,、,b,、,c,的值。,实 验,综合实验,写几个函数:,1,)、输入,10,个学生的姓名和学号;,2,)、可增加、删除学生;,3,)、按学号从小到大排序,姓名顺序也随之调整;,4,)、输入一个学号,可显示姓名;,要求从主函数中输入学号,输出姓名,
展开阅读全文