11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度

Slides:



Advertisements
Similar presentations
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
Advertisements

阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
河內塔(Hanoi)問題.
C语言程序设计 主讲教师 :张群燕 电话:
电子成绩单项目实现.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
第一章 C语言概述 计算机公共教学部.
编译原理上机实习
崇拜即將開始,請大家安靜片刻, 預備心靈敬拜上帝。
5 函数(二) 5.1 基本知识 5.2 函数重载 5.3 示例 5.4 变量的作用域和生命期 5.5 编译预处理 5.6 递归函数.
预测股市将不涨,可亮出卖出认购期权(Short Call) 招数,获得权利金,增加收益,持股者也可使出此招,为股票锁定卖出价。这一剑法在到期日股价低于行权价格时,能获得全部权利金收入。
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
高级语言程序设计 主讲人:陈玉华.
物件導向程式設計 (Object-Oriented rogramming)
函數(一) 自訂函數、遞迴函數 綠園.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
第六讲栈和队列(一)增加 1/13.
Cyclic Hanoi问题 李凯旭.
动态规划(Dynamic Programming)
第三章 栈和队列.
C Programming in Action
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
鄧姚文 資料結構 第五章:遞迴 鄧姚文
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
程式結構&語法.
顺序表的删除.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
6.1递归的概念 若一个算法直接的或间接的调用自己本身,则称这个算法是递归算法。 存在算法调用自己的情况: (1)问题的定义是递推的
第6章 递 归 6.1 递归的概念 6.2 递归算法的设计 6.3 递归过程和递归工作栈 6.4 递归算法的效率分析
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
主讲:相方莉.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
1、递归的概念 2、递归函数的设计 3、递归过程与递归工作栈 4、例 5、递归过程的非递归化
C语言程序设计 李祥 QQ:
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
第二章 类型、对象、运算符和表达式.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
遞迴 Recursion.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
第十二章 位运算.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第7章 图.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二次课后作业答案 函数式编程和逻辑式编程
Presentation transcript:

11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度 第十一章 递归 11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度

11.1 递归的定义 概念: 递归:一个事件或对象部分的由自己组成,或者按它自己来定义 递归算法分为递推和回归 11.1 递归的定义 概念: 递归:一个事件或对象部分的由自己组成,或者按它自己来定义 递归算法分为递推和回归 递推: 为得到问题的解,将其推到比原来问题简单的问题求解上 回归 :简单问题得到解后,回归到原问题的解上

间接递归:一函数在调用其他函数时,又产生了对自身的调用 A( ) B( ) 递归函数分类: 直接递归:函数直接调用本身 A( ) {…… CALL A( ) ...... } 间接递归:一函数在调用其他函数时,又产生了对自身的调用 A( ) B( ) {…… {…… CALL B() CALL A() …… } …… }

11.2 常见递归问题 汉诺塔问题 八皇后问题 组合公式的计算

11.2.1. 汉诺塔问题 问题描述:有三个命名为A、B、C的塔座,在塔座A上插有n个直径各不相同的,从小到大依次编号为1,2,3,……,n的圆盘,编号越大的圆盘其直径越大;要求将A轴上的n个圆盘全部移至塔座C上并仍按同样顺序叠放,并且圆盘移动时必须遵循下列规则: 每次只能移动一个圆盘; 圆盘可以插入A、B、C中任一个塔座上; 任何时候都不能将一个较大的圆盘压在较小的圆盘上

事例:n=3

事例:n=6

算法: void hanoi ( int n, char x, char y, char z) {/*递归算法*/ if(n= =1) move(x,z); else { hanoi(n-1,x,z,y);/*把N-1个盘子从X借助Z移到Y*/ printf(”%c-%c\n”, x,z);/*把盘子N从X直接移到Z*/ hanoi(n-1,y,x,z);/*把N-1个盘子从Y借助X移到Z */ }

11.2.2. 八皇后问题 问题描述:在一个88的棋盘上放置8个皇后,那么n个皇后的问题就是在nn的棋盘上放置n个皇后;规则是:不允许两个皇后在同一行,同一列或同一对角线上 图示:

事例:四皇后问题:

算法: Void Eight_que(int q) { int i,j; while(i<max_N) { if (search(q,i)!= null) queen[q]=j; if(q=max_n-1) for(j=1;j<max_n;j++) printf(“%d,%d”,j, queen (j)); } else Eight_que(q+1); i++; } }

int search(int x,int i) { int j,m,atk; atk=0; j=1; while(atk = =0) && (j < x)) m= queen[j]; atk=(m= =i)||(abs(m-i)= = abs(j-x)); j++; } return(atk); }/*search*/

11.2.3. 组合公式的计算 问题描述:

11.3 递归的实现 采用递归算法具备的条件 递归的实现机制 要解决的问题可以转化成另一个问题,解决新问题的方法与原始问题的解决方法相同 11.3 递归的实现 采用递归算法具备的条件 要解决的问题可以转化成另一个问题,解决新问题的方法与原始问题的解决方法相同 必须具备终止递归的条件 递归的实现机制 分配调用过程函数所需要的数据区 保存返回地址,传递参数信息 把控制权转移给被调用函数

被调用函数运行结束,需完成: 递归工作栈 的变化: 保存返回时的有关信息 释放被调有函数占用的数据区 按调用时保存的返回地址,把控制权转移到调用函数中调用语句的下一条语句 递归工作栈 的变化:

事例一:求n! 算法: int Dg( int n) { long y; int x; x=n-1; if (n<0) return error; else if ( n = =0|| n = =1 ) return(1); y= Dg(x) return(Dg(x) * n); }

事例二:调用dg(n),求6!

事例三:斐波那齐数列(Fibonacci Number) fib(n)= 算法: int fib(int n) { if(n<=1) return( n); Else return(fib(n-1)+fib(n-2)); } n n=0或n=1 fib(n-1)+fib(n-2) n>1

求fib(6)

11.4 递归转化为非递归的一般过程 转换步骤: 转换算法: #define max 50 typedef struct { 11.4 递归转化为非递归的一般过程 转换步骤: 写出问题的递归形式 转换成模拟形态,包括准备所有栈和临时地址 除去多余的栈和变量 得到一有效的非递归程序 转换算法: #define max 50 typedef struct { int param; int x; long y; short return_addr;/*返回地址*/ }elemtype;

typedef struct { int top; elemtype item(max); }qstype; #include <stdio.h> #include stack.h long simfact(int n) { elemtype curr_area; /*当前工作区的指针*/ qtype s; /*栈数据区的指针*/ long result; /*传递当前执行的结果*/ short i; /*判断转向的返回地址*/ s.Top=-1; curr_area.x=0; curr_area.y=0; curr_area.Param=0; curr_area.return_addr=0; pushQ(&s,curr_area); curr_area.Param=0;

curr_area.return_addr=1;/*返回地址1*/ while(!Empty(s)) { if (curr_area.Param= =0) result=1; i= curr_area.return_addr;/*取当前返回地址*/ Curr_area=PopQ(&s);/*退栈*/ Switch(i) case 1: goto addr_1; case 2: goto addr_2; } curr_area.x=curr_area.Param-1; PushQ(&s, (curr_area); Curr_area.Param=curr_area.x; Curr_area.return_addr=2;/*返回地址2*/

addr_2: /*以下模拟返回递归调用(即返回地址2)过程*/ curr_area.y = result; result=(curr_area.Param)*(curr_area.y); i= curr_area.return_addr; Curr_area=popQ(&s); Switch(i) { case 1: goto addr_1; case 2: goto addr_2; } /*以下模拟返回主调用函数(即返回地址1)过程*/ addr_1: return(result);

事例:斐波那齐数列的非递归算法 void fib(int n) { int prev,now,next,j; if(n<=1)return(n); else prev=0; now=1; for(j=2;j<=n;j++) next=prev+now; prev=now; now=next; } return(next);

11.5 递归的时间和空间复杂度 事例讨论:非递归的实现6!的算法 时间复杂度为:T(6)=O(1) 空间空间复杂度:O(1) 11.5 递归的时间和空间复杂度 事例讨论:非递归的实现6!的算法 Int Dg( ) { int i, result; result=1; for (i= =1; i<6; i++) result=result*i; return result; } 时间复杂度为:T(6)=O(1) 空间空间复杂度:O(1)

时间复杂度:T(6)=O(f1(6))+O(f2(6)) 空间复杂度比非递归的要大 6!递归实现的算法 int Dg(n) {/*递归调用函数*/ int f; if (n<0) return error; else if (n= =0|| n= =1) f=1; f=dg(n-1)*n; return(f ); } 时间复杂度:T(6)=O(f1(6))+O(f2(6)) 空间复杂度比非递归的要大