3.5 用递归法解决问题 黄学鸿.

Slides:



Advertisements
Similar presentations
编程加工 信息的. 趣味导入拓展提升大显身手总结反思学以致用 传说古代印度有个国王叫舍罕,他很迷恋棋类,而 宰相达依尔是个聪明的大臣,发明了国际象棋。国王玩 得爱不释手,决定奖赏宰相。达依尔说:陛下,我别无 他求,请你在这张棋盘的第一个格子里赏我 1 粒麦子; 在第二个格子里赏我 2 粒麦子;在第三个格子里赏我.
Advertisements

第2章 Visual Basic 6.0编程基础 (第一部分)
計算機概論 第4章 基本視窗程式應用 4-1 程式語言簡介 4-2 演算法與流程圖 4-3 視窗程式語言設計 4-4 資料結構.
Demo-dataSource與DropDownList
ooxx這個遊戲程式,非常的簡單只要你小時候會玩井字遊戲即可把電腦打敗,可以說是一種考智力取勝的遊戲。
課程名稱:程式設計 授課老師:________
第四章 控制结构.
赋值语句与输入、输出语句.
程式語言(I)- Visual Basic 6.0 第 9 章 結構化程式設計
高中信息技术新课程探讨 算法与程序设计教学实践与探讨 江苏省新海高级中学  张丽.
Access数据库程序设计 总复习.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
高等医药院校药学类第三轮规划教材——大学计算机基础
课标教材下教研工作的 实践与思考 山东临沂市教育科学研究中心 郭允远.
算法和程序设计 第4课 分支结构的算法设计 •.
第五章 数组.
題目:台灣客運 南臺科技大學 機械工程系 班級:奈米一乙 學號:4A 姓名:蔡政堯 授課教師:謝慶存
Visual Basic程序设计.
程式語言Visual Basic 變數的可視範圍
VB內建函數與應用.
課程名稱:程式設計 授課老師:________
第二章 Visual Basic语言基础.
第5章 数组 Visual Basic程序设计.
程式語言 -Visual Basic 變數、常數與資料型態.
Visual Basic程序设计 第八章 过程 -子程序和函数
过程 第 7 章.
初识Visual Basic.
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
流程控制、陣列 台南市聖功女子高級中學 毛全良.
Timer & Format.
计算机程序设计强化复习 Visual Basic 6.0.
程序的基本要素 2018/12/6.
Visual Basic 程序设计 教师:王 杨 电话:
程式語言Visual Basic 傳址與傳值
第12章 VBA模块设计.
RWM600 (13.56MHz) Reader Antenna.
RWM600 (13.56MHz) Reader Antenna.
丙級電腦軟設-VB程式設計 資料來源:林文恭研究室 整理:張福生.
新觀念的 VB6 教本 第 6 章 資料型別.
第5章 Visual Basic控制结构 之 常用算法举例
第 8 章 过程.
广州市教育局教学研究室编写的 初中《信息技术》第二册第二章 《程序设计初步》
Visual Basic程序设计.
算法与程序设计 周少品.
VB程序设计语言 主讲教师:王 杨.
VB程序设计语言 主讲教师:王 杨.
程式設計 Visual Basic簡介 週次:2 建國技術學院 資管系 饒瑞佶 2003年9月17日.
程序设计基础 第 2 章 学习程序设计的基本方法: 多练 模仿.
VB程序设计语言 主讲教师:王 杨.
VB程序设计语言 主讲教师:王 杨.
程式語言(I)- Visual Basic 6.0 第 8 章 模組化程式設計I-副程式與自定函數.
For x = 0 To 9 For y = 0 To 9 z = *x + 10*y …… Next y
江西财经大学信息管理学院 《数据库应用》课程组2007
VB语言程序设计教程.
小结 郭清溥.
现代信息技术 微电子技术 计算机技术 传感技术 通信技术 处理、存储信息的技术 传感、采集技术 传递信息的技术
程序基础 2019/4/25.
第二章、第三章错题分析.
計算機概論 跨越講義 第4章 基本視窗程式應用 4-1 程式語言簡介 4-2 結構化VS物件導向程式設計
选择结构设计 第 4 章 程序流程有三种最基本的控制结构,即顺序结构、选择结构和循环结构。
计算机应用基础 潍坊学院 计算机工程学院 主讲人:丁素英.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
1位选手参加了歌唱比赛,评委们的评分如下:
第5章 数组 5.1 数组概述 5.2 静态数组和动态数组 5.3 数组的基本操作 5.4 控件数组 5.5 数组在自定义数据类型中的应用.
1、过程概述 2、函数过程 3、子过程 4、过程的使用 5、传递参数 6、过程的嵌套
解析算法与枚举算法.
算法与Visual Basic程序基础(二)
VB语言基础 一、 常量 1 定义:在程序运行过程中不能发生改变的量 2 分类 整型常量: 整数 不带小数点的数 数值常量
程序调试与错误处理.
Presentation transcript:

3.5 用递归法解决问题 黄学鸿

故事 “从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢?从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢? 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢?”…………

这个故事有什么特点? 自己调用自己 如果在一个函数中,它自己调用了自己,这种现象叫递归调用。 如果A函数调用B函数,B函数又反过来调用A函数,那这种现象也叫做递归调用。 如果一个函数在定义时,直接或间接的调用了自己,这种算法在程序设计中统称为递归法。

Abs()、len()、date()、sqr()、msgbox()等 自定义函数 递归法一般需要定义函数来实现。 Abs()、len()、date()、sqr()、msgbox()等 虽然VB为我们提供了大量的标准函数,但我们在实际应用时难免有时还是找不到合意的,那就只有自己解决了,这样为了一个特定的任务而编出来的函数叫自定义函数。

二、自定义函数的作用 1、可以方便的把较为复杂的问题分解成若干个小问题去处理。(公司里就是采用这中模式的。) 2、使程序结构清晰,层次分明,增强了程序的可读性。

一、标准函数 VB给我们提供了一些标准函数,我们不用了解这些函数如何求出来的,只管直接调用它们,挺方便的。如正弦函数,余弦函数,算术平方根......有了这些函数,我们觉得很省事。如:求1加到100的算术平方根这个程序我们可以这样编写: 例1          dim I as integer, s as single              s=0              for i=1 to 100 do                s=s+sqr(i) next i              writeln('s=',s)

在这个程序里,我们直接用到了求平方根函数,至于sqr(1),sqr(2)如何求出来的我们不需过问,只管直接用它的结果便是了。 象这样,VB给我们提供的,我们不用了解这些函数如何求出来的,只管直接调用它们的这类函数叫做标准函数。 二、用户自定义函数 我们来看看下面一个例子:求:1!+2!+3!+...+10!=? 如果要编写程序,我们看到求阶乘的操作要执行10次,只不过每次所求的数不同。我们想:不至于编写10遍求阶乘的程序吧。我们希望有一个求阶乘的函数,假设为JS(X),那么我们就可以这样求这道题了:

例2         dim I as integer, j as integer          dim s as integer              s=0              for i=1 to 10 do                s=s+js(i) next i              writeln('s=',s) 现在的问题是:VB没提供JS(X)这样一个标准函数,这个程序是通不过的。如果是PASCAL的标准函数,我们可以直接调用,如前面的sqr(i),而PASCAL提供给我们的可供直接调用的标准函数不多。没关系,我们编写自己的函数!

在VB中,自定义函数形式如下: 三、函数编写 [Public|Private] Function <函数名称> ([参数列表]) [As 类型] 局部常量、变量定义 语句组 函数名称=返回值 End Function Public(公共的)-----全局变量,指在所有程序(包括主程序和过程)中都可以使用的内存变量. Private(私人的)-----局部变量,用private语句声明的变量可被本窗体/模块的任何过程访问,但其他模块却不能访问该变量. 参数列表:   [ByVal | ByRef]  变量名 [( )]  [As 类型]    表示该参数按地址传递 会直接改变原来的变量值 表示该参数按值传递 不会修改变量原来的值

例3            编写一求阶乘的函数。 我们给此函数取一名字就叫JS。 fUNCTION js(n as integer) as integer       dim I as integer, s as integer              s=1              for i=1 to n do                                                               s=s*i next i js=s  end

自定义函数的调用,可以有三种格式: 变量=函数名称(参数) Call 函数名称(参数) 函数名称 参数

Private Function daxiao(a As Integer, b As Integer) Dim t As Integer If a < b Then t = a a = b b = t End If End Function Private Sub Command1_Click() Dim a As Integer, b As Integer a = 5 b = 9 Call daxiao(a, b) Print "a="; a, "b="; b End Sub Private Sub Command1_Click() Dim a As Integer, b As Integer a = 5 b = 9 Daxiao a, b Print "a="; a, "b="; b End Sub

子过程 函数 子过程和函数的本质是一样的,在VB中往往将函数看做特殊的子过程 变量=函数名称(参数) Call 函数名称(参数) [Public|private] sub <子过程名称> ([参数列表]) 局部常量 变量定义 过程语句组 End sub 子过程和函数的本质是一样的,在VB中往往将函数看做特殊的子过程 子过程与函数的区别: 关键字:函数(Function) 子过程(sub) 返回值:函数(可以有) 子过程(无) 调用格式: 变量=函数名称(参数) Call 函数名称(参数) 函数名称 参数 函数 子过程 Call 函数名称(参数) 函数名称 参数

递归调用算法 使用递归算法必须要满足以下的递归条件: (1)存在递归结束条件及结束时的值 (2)能用递归形式表示,且递归向终止条件发展

兔子繁殖问题 有人养了一对兔子,这对兔子以后每月生一对兔子,新生兔子从第三个月开始,也是每月生一对兔子.从第三个月起,当月新生兔子数为前两月新生兔子数之和.问12个月后这人有多少对新生兔子?

问题分析 1月 2月 3月 4月 5月

图3-25 函数递归调用关系 Recursion(5)=Recursion(4)+Recursion(3) 图3-25 函数递归调用关系 Recursion(5)=Recursion(4)+Recursion(3) Recursion(4)=Recursion(3)+Recursion(2) Recursion(3)=Recursion(2)+Recursion(1) Recursion(2)=1 Recursion(1)=1

关于递归的例子: 例1:假设有如下sub过程: Sub s(x as single,y as single) t=x x=t/y y=t mod y End sub Private sub command1_click() dim a as single dim b as single a=5 b=4 s a,b 函数名称 参数 Print a,b

例2:在窗体上画一个名称为command1的命令按钮,然后编写如下通用过程和命令按钮的事件过程: Private function fun(byval m as integer) If m mod 2 =0 then fun=2 else fun=1 end if End function Private sub command1_click() dim I as integer,s as integer s=0 For I=1 to 5 s=s+fun(I) Next I Print s End sub

例3:单击命令按钮时,下列程序的执行结果为( ) 例3:单击命令按钮时,下列程序的执行结果为( ) Private sub command1_click() Dim x as integer,y as integer X=12:y=32 Call proc(x,y) Print x;y End sub Public sub proc(n as integer,by val m as integer) N=n mod 10 A、1232 B、232 C、23 D、123