第11章 递归 张坤龙 zhangkl@tju.edu.cn 天津大学计算机学院.

Slides:



Advertisements
Similar presentations
Go !报账去 ~ 中国科学技术大学财务报销及相关业务办理指南. 本次培训的主旨: 为了规范学校财务管理和会计基础工作,方便全校 教职工研究生等相关人员了解财务报销程序及报销要求 ,提高报销工作效率和质量,更好的服务全校师生,根 据国家财经法律、法规以及学校相关的财务管理制度规 定,结合我校财务工作的实际情况,进行本次培训。
Advertisements

While 迴圈 - 不知重複執行次數
单元二:面向对象程序设计 任务二:借书卡程序设计.
第三讲 面向对象(上).
JAVA 编 程 技 术 主编 贾振华 2010年1月.
一、流水贷主要规则介绍 流水贷主要准入规则 企业类型 中国大陆注册企业,生产型企业+贸易公司(个体工商户、个人独资企业均可准入)
霍乱知识讲座 (Cholera) 中国援加纳医疗队.
C语言程序设计 李伟光.
教學經驗分享 吳毅成 國立交通大學資訊工程系 2012年4月.
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
“八皇后”问题 崔萌萌 吕金华.
数学运算.
一、问题的提出 1. 计算圆的面积 正六边形的面积 正十二边形的面积 正 形的面积.
第一章 面向对象程序设计.
第 5 章 流程控制 (一): 條件分支.
精英型软件人才 培养模式的探索与实践 卢 苇 北京交通大学国家示范性软件学院.
食品微生物学 (第2版) 主编 杨玉红 陈淑范 武汉理工大学出版社 2014年4月.
张坤龙 计算机科学与技术学院 大学计算机基础 课程介绍 张坤龙 计算机科学与技术学院.
第三章 控制结构.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
物件導向程式設計 (Object-Oriented rogramming)
函數(一) 自訂函數、遞迴函數 綠園.
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
If … else 選擇結構 P27.
Java 程式設計 講師:FrankLin.
程式撰寫流程.
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
算法的基本概念.
C语言 程序设计基础与试验 刘新国、2012年秋.
郑晟 昆明理工大学 云南省计算机技术应用重点实验室
第五張 方法.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
計數式重複敘述 for 迴圈 P
第六章 属性、索引器、委托和事件.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
简单工厂模式.
第二章 词法分析4 词法分析程序实现 构造词法分析器步骤 单词的形式化描述 词法分析程序的实现.
程式結構&語法.
數學遊戲一 河內塔 (Tower of Hanoi)
Java變數 2014/6/24.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
演算法時間複雜度 (The Complexity of Algorithms)
C程序设计.
第5章 函 数.
第一章 C语言概述 教师:周芸.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
#include <iostream.h>
方法進階及物件導向基礎 Lecturer: 楊昌樺.
第二章 Java基本语法 讲师:复凡.
遞迴 Recursion.
方格紙上畫正方形.
變數、資料型態、運算子.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

第11章 递归 张坤龙 zhangkl@tju.edu.cn 天津大学计算机学院

概要 递归思想 递归编程 使用递归解决问题 图形程序中的递归用法

递归思想 递归定义是以一种事物自身定义自身的过程 当定义一个英文单词时,递归定义通常没有帮助 但是有些场合,递归定义却是一个一种表达概念的恰当 方法 在应用递归来编程前,培养递归思想是最好的方法

递归定义 考虑下面的数字列表: 24, 88, 40, 37 这样的列表也能这样定义: 列表是: 一个数字 或者: 一个数字 , 列表 即, 列表定义尾一个数字或者一个数字后面跟一个逗号(,)再跟一个列表 列表的概念被用于定义列表自身

递归定义 列表定义的递归部分,使用了多次,最终以非递归部分结束: 数字 逗号 列表 24 , 88, 40, 37 88 , 40, 37 数字 逗号 列表 24 , 88, 40, 37 88 , 40, 37 数字 逗号 列表 40 , 37 数字 37

无穷递归 所有的递归定义都应该有非递归部分和递归部分构成 如果没有非递归部分,递归将无法终止 这样的定义就是无穷递归 非递归部分通常称作基本事件

递归定义 对于任何正整数N,N!(N的阶乘)的值定义为所有1~N (包括N)之间的所有整数的乘积 此定义的递归表达如下: 1! = 1 1! = 1 N! = N * (N-1)! 使用阶乘来定义另一个阶乘 最终,基本事件是1!,1!定义为1

递归定义 5! 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 2 6 24 120

概要 递归思想 递归编程 使用递归解决问题 图形程序中的递归用法

递归程序设计 Java中一个方法调用自身称作递归方法 递归方法的代码必须能够处理基本事件和递归事件 每次方法调用,必须建立新的执行环境:带有新参数和 局部变量 当方法结束时,控制流返回调用调用该方法的上一层方 法中

递归程序设计 考虑计算1~N的求和计算 这个问题的递归定义如下:

递归程序设计 // This method returns the sum of 1 to num public int sum (int num) { int result; if (num == 1) result = 1; else result = num + sum (n-1); return result; }

递归程序设计 main sum sum(3) sum(1) sum(2) result = 1 result = 3 result = 6

递归程序设计 需要注意的是,如果可以采用递归解决一个问题,并不 意味着我们就应该采用递归取解决它 例如,我们不应该采用递归取解决1~N的求和计算问 题,因为循环迭代求和的方法更易于理解 然而,对于其他一些问题,递归提供了一种简洁的解决 方法,并且比迭代清楚 是否采用递归,必须具体问题具体分析

间接递归 一个方法调用自身称作直接递归 一个方法调用其他方法,最终导致再次调用自己,称作 间接递归 例如:方法m1调用m2,方法m2调用m3,方法m3又 调用m1 间接递归通常更难于追踪和调试

间接递归 m1 m2 m3

概要 递归思想 递归编程 使用递归解决问题 图形程序中的递归用法

迷宫旅行 采用递归定义一条通过迷宫的路径 每个位置,都可以在任意方法搜索 递归追踪通过迷宫的路径 基本事件就是无效的移动或者到达最终的目的地 参考 MazeSearch.java (第397页) 参考 Maze.java (第398页)

Hanoi塔问题 Hanoi塔问题是经典的递归算法实例 此问题由3个竖立的塔座和一组中间有孔的圆盘组成 每次只能移动一个圆盘 不能将大圆盘放到小圆盘的上面 除非圆盘正处于在塔座间移动的过程中,否则所有圆盘必须在 某个塔座上

Hanoi塔问题 初始状态 第一次移动 第二次移动 第三次移动

Hanoi塔问题 第四次移动 第五次移动 第六次移动 第七次移动 (完成)

Hanoi塔问题 如果采用迭代解决方案将使问题更加复杂 但是采用递归将使问题更加简洁 参考 SolveTowers.java (第402页) 参考 TowersOfHanoi.java (第403页)

概要 递归思想 递归编程 使用递归解决问题 图形程序中的递归用法

Fractals分形 分形是将相同模式的图案以不同的比例和方向构成的一 个几何图形 Koch雪花是 由一个等边三角形开始的特殊的一种分形 参考 KochSnowflake.java (第406页) 参考 KochPanel.java (第408页)

Koch 雪花 < x5, y5> < x1, y1> < x5, y5> 变为

Koch 雪花

Koch雪花

本章小结 以递归模式思考 以递归模式编程 递归使用纠错 递归使用举例