1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
Introduction 基本概念 授課老師:蕭志明
資料結構與演算法 課程教學投影片.
第 九 章 搜尋(Search) 課程名稱:資料結構 授課老師:_____________.
算法设计与分析 李清勇 教授 办公室:第九教学楼北201.
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
请说出牛顿第一定律的内容。.
数列(一) 自强不息和谐发展 授课教师:喻永明.
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
C#程序设计案例教程 第3章 程 序 结 构.
评价是为了促进 学生发展的评价。. 评价是为了促进 学生发展的评价。 语言有温度,字词知冷暖.
第十章 内部排序 知识点3:快速排序.
第8章 查找 数据结构(C++描述).
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
利用共同供應契約 辦理大量訂購流程說明.
生活中的數列 ==費氏數列==.
第三章栈和队列 栈 队列 递归.
第5章 递归 5.1 什么是递归 5.2 递归算法的设计 本章小结.
物件導向程式設計 (Object-Oriented rogramming)
函數(一) 自訂函數、遞迴函數 綠園.
复习.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
第 1 章 演算法分析.
搜尋資料結構 Search Structures.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
辅导课程六.
第九章 查找 2018/12/9.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第一章 函数 函数 — 研究对象—第一章 分析基础 极限 — 研究方法—第二章 连续 — 研究桥梁—第二章.
动态规划(Dynamic Programming)
C Programming in Action
第11章 递归 张坤龙 天津大学计算机学院.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第一章 函数与极限.
鄧姚文 資料結構 第一章:基本概念 鄧姚文
鄧姚文 資料結構 第五章:遞迴 鄧姚文
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
专题作业.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
Chap7 Recursive.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度
离散数学─归纳与递归 南京大学计算机科学与技术系
6.1递归的概念 若一个算法直接的或间接的调用自己本身,则称这个算法是递归算法。 存在算法调用自己的情况: (1)问题的定义是递推的
第6章 递 归 6.1 递归的概念 6.2 递归算法的设计 6.3 递归过程和递归工作栈 6.4 递归算法的效率分析
Ch.9 查找 §9.1 基本概念 查找和排序是两个重要的运算
演算法時間複雜度 (The Complexity of Algorithms)
C程序设计.
第4章 Excel电子表格制作软件 4.4 函数(一).
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
二分查找的应用 ——李江贝, 郝琰 2017年9月28日.
第二章 类型、对象、运算符和表达式.
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
Review 1~3.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
1.非线性规划模型 2.非线性规划的Matlab形式
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
遞迴 Recursion.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
第二次课后作业答案 函数式编程和逻辑式编程
Presentation transcript:

1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化 八、递归 1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化

1、递归的概念 在数学上,一个正整数的阶乘通常用以下公式进行定义: n! = n×(n-1)×· · · ×1, 这种技法作为阶乘函数不是很严密。 正规的阶乘定义应为 1 if n = 0 n! = n ×(n-1)! If n >0 4! = 4 ×3! = 4 ×(3 ×2!) = 4 ×(3 ×(2 ×1!)) = 4 ×(3 ×(2×(1×0!))) = 4 ×(3 ×(2×(1×1))) = 4 ×(3 ×(2×1)) = 4 ×(3 ×2) 利用前一次由较小 = 4 ×6 值计算出的结果。 = 24

long Fractorial(long n) 递归的定义 若一个对象部分地包含它自己,或用它自己给自己下定义,称这 个对象是递归的;若一个过程直接地或间接地调用自己,则称这 个过程是递归的过程。 long Fractorial(long n) { if (n = = 0) return 1; else return n﹡fractorial(n-1); } 用递归的情况 ⑴定义是递归的; ⑵数据结构是递归的; 如:①一个结点,其指针域为NULL,是一个单链表; ②一个结点,其指针域指向一个单链表,仍是一个单链表。 ⑶问题的解法是递归的。

2、递归函数的设计 每一个递归过程由两部分组成: ⑴一个最小的基础情况,它不需用递归来处理; ⑵一个通用的方法(又称递归步骤),它根据先前某次值求当前值, 这一步骤应该导致过程的终止。 使用 if– else 语句,if 语句块判断递归结束的条件,else语句块处 理递归的情况。 幂函数计算 xn = 1 n = 0 x﹡x(n-1) n >0 float Fractorial(float x,int n) { if (n = = 0) return 1 else return x ﹡Fractorial(x,n-1) }

递归函数的设计 Hanoi塔问题 结束条件:只有一块盘子,将这一盘子直接送到柱C 递归过程:用C柱过渡,将A柱上的盘子送到柱B 直接把A柱上最后一个盘子移到C 将A柱为过渡, 将B柱上(n-1)个盘子移到C void Honoi (int t, string A, string B, string C) { if (n = = 1) cout<<“move”<<A<<“to”<<C<<endl else hanoi( n – 1, A, C, B); cout<<“move”<<A<<“to”<<C<<endl; hanoi( n – 1, B, A, C); }

3、递归过程与递归工作栈 下图反映了阶乘函数计算函数调用过程 4! = 4 ×3! = 4 ×(3 ×2!) = 4 ×(3 ×(2 ×1!)) = 4 ×(3 ×(2×(1×0!))) = 4 ×(3 ×(2×(1×1))) = 4 ×(3 ×(2×1)) = 4 ×(3 ×2) = 4 ×6 = 24 参数 计算 返回 0 0! = 1 1 参数 计算 返回 1 1×fractorial(0) 1 参数 计算 返回 2 2×fractorial(1) 2 参数 计算 返回 3 3×fractorial(2) 6 参数 计算 返回 4 4×fractorial(3) 24 主程序 main

4、例 ⑴折半查找 终止条件:查找成功或子表成为空表; 递归步骤:按中间值与关键字大小确定在下子表或上子表中继续 查找。 template<class T> int BinSearch(T A[ ], int low, int high, T key) { int midl; T midvalue; if (low>high) return (-1); else mid = (low+high)/2; midvalue = A[mid];

例(折半查找) // 终止条件:找到key if (key = = midvalue) return mid; // 若key<midvalue, 则查下子表;否则,查上子表 else if (key < midvalue) // return BinSearch(A, low, mid – 1, key); else return BinSearch ( A, mid+1, high, key); }

Fibonacci数列 Fibonacci 数列的定义 1 若n = 1或2 F(n) = F(n –1)+F(n – 2) 若n>2 终止条件:F(1) = F(2)=1 递归步骤: F(n) = F(n –1)+F(n – 2) long Fib(int n) { if (n = =1‖n = =2) return 1 else return Fib(n-1)+Fib(n – 2) }

5、递归过程的非递归化 用单纯的循环方式非递归化 阶乘的非递归算法 long Factorial (long n) { int prod = 1, i; if (n > 0) for (i = 1; i< = n; i+ +) prod*=i; return prod; }

递归过程的非递归化 用迭代法非递归化 Fib(6) Fib(5) Fib(4) Fib(4) Fib(3) Fib(3) Fib(2)

迭代法计算Fibonacci数列 Fibonacci数列的迭代计算 long FibIter(int n) { long twoback =1, oneback = 1, current; int i; // FibIter(1) = FibIter(2) = 1 if (n = =1‖n = =2) return 1; // current = twoback+oneback, n>=3 else for (i =3; i <=n; i + +) current = twoback + oneback; twoback = oneback; oneback = current; }

作 业 书面作业 10.6 10.11 上机题 10.1 10.2 10.9