1、1,离散数学Discrete Mathematics,汪荣贵 教授合肥工业大学软件学院专用课件2010.04,1,2018/7/3,CHAPTER 2 The Foundations: Algorithms, the Integers ,and Matrices,2.1 Algorithms算法2.2 Complexity of Algorithms算法的复杂性2.3 The Integers and Division整数和除法2.4 Integers and Algorithm整数和算法2.5 Applications of Number Theory数论的应用2.6 Matrices矩阵2
2、.7 Recursion 递归,学习内容,递 归,递归定义 引言 递归地定义函数 递归地定义集合与结构递归算法 引言 递归与迭代 归并排序,4,2018/7/3,递归定义,引言递归地定义函数递归地定义集合与结构,5,2018/7/3,6,2018/7/3,Recursive Definition 递归定义,Introduction 引言,Sometimes it is difficult to express the members of an object or numerical sequence explicitly. 有时候明确地表示一个对象或数字序列的构成是很困难的For examp
3、le, The Fibonacci sequence斐波纳契数列: fn = 0,1,1,2,3,5,8,13,21,34,55,7,2018/7/3,In a recursive definition, an object is defined in terms of itself 用某个对象定义它自身,这种过程称为递归定义。We can recursively define sequences, functions and sets.我们可以递归定义序列、函数和集合。,递归定义,递归定义图片,8,2018/7/3,递归定义,引言递归地定义函数递归地定义集合与结构,9,2018/7/3,10
4、,2018/7/3,Recursively defined functions, with the set of nonnegative integers as its domain: 以非负整数集合作为其定义域的递归定义函数。Basis Step: 规定这个函数在0处的值.Recursive Step: 给出从较小的整数处的值来求当前值的规则.这样的定义称为递归定义或归纳定义。,Recursively defined functions递归定义函数,Example 1假定f是用 f(0)=3 f(n+1)=2f(n)+3来递归地定义的。求出f(1),f(2),f(3)和f(4)解:从这个递归
5、定义得出 f(1)=2f(0)+3=2*3+3=9 f(2)=2f(1)+3=2*9+3=21 f(3)=2f(2)+3=2*21+3=45 f(4)=2f(3)+3=2*45+3=93,递归定义函数例题,11,2018/7/3,Example 2:给出阶乘函数F(n)=n!的归纳定义解:可以通过规定阶乘函数的初值,即F(0)=1,并且给出F(n)求出F(n+1)的规则,来定义这个函数。要得出这个结果,注意通过乘以n+1就从n!计算出(n+1)!。因此,所需要的规则是F(n+1)=(n+1)F(n)。 为了从例2里求出的递归定义来确定阶乘函数的一个值,比如F(5)=5!,有必要多次使用说明如何
6、F(n)表示F(n+1)的规则:F(5)=5F(4)=54F(3)=543F(2)=5432F(1)=54321F(0)=543211=120,12,2018/7/3,Example 3给出an的递归定义,其中a是非负零实数而且是非负整数。 解:这个递归定义包括两个部分。首先规定a0,即a0=1.然后给出从an求出an+1的规则,即对n=0,1,2,3,来说an+1 =a* an 。这两个等式对所有非负整数唯一地定义了an.,13,2018/7/3,递归定义函数例题,14,2018/7/3,Recursively defined functions are well-defined.递归定义的
7、函数是良定义的,Why?Let P(n) be the statement “f is well-defined at n . (1) P(0) is true.Assume that P(n) is true. Then f is well-defined at n +1. Since f(n+1) is given in terms of f(n).,递归定义的函数是良定义的,15,2018/7/3,定义 1The Fibonacci numbers 斐波那契数 fn = 0,1,1,2,3,5,8,13,21,34,55,The Fibonacci numbers can be defi
8、ned斐波那契数可被定义为: f 0 = 0 f 1 = 1 f n = f n-1 + f n-2 for n=2,3,4,斐波那契数,Example 5 斐波那契数f0,f1,f2,是用等式f0=0,f1=1,以及n=2,3,4,来说fn=fn-1+fn-2来定义的。斐波那契数f2, f3,f4 ,f5 ,f6 是什么?解:因为这个定义的第一部分说f0=0和f1=1 ,所以从这个定义的第二部分得出 f2 = f1 + f0 =1+0=1 f3 = f2 + f1 =1+1=2 f4 = f3 + f2 =2+1=3 f5 = f4 + f3 =3+2=5 f6 = f5 + f4 =5+3
9、=8,16,2018/7/3,17,2018/7/3,Example 6 Show that,Proof:,(1) Inductive base,Assume that P(k) is true, namely, that for all integers k with .,We must show that P(k+1) is true, that is .,Therefore,Since is the solution of , it follows that,By the inductive hypothesis, if , it follows that,Therefore,(2) I
10、nductive step,递归定义,引言递归地定义函数递归地定义集合与结构,18,2018/7/3,19,2018/7/3,Recursively defined sets 递归地定义集合,Sets can be defined recursively.Basis Step: Specify an initial collection of elements.规定初始的一些元素Recursive Step: Give the rules for constructing elements of the set from other elements already in the set. 给
11、出用来从已知属于集合的元素来构造集合的新元素的规则,Sets described in this way are well-defined.,20,2018/7/3,Example 7 Consider the subset of the set of integers defined by考虑如下定义的整数集合的子集S,Basis Step: 3 SRecursive Step: if x S and y S , then x+y S,子集的定义,21,2018/7/3,定义 2 The set * of strings over the alphabet .字母表 上的字符串的集合* 递归
12、地定义成:,Solution:,Basis Step: *, where is the empty string containing no symbols. *, (其中是不包含任何符号的空串)Recursive Step: x * whenever * and x .若x 且 * ,则x *,字符串的集合的定义,22,2018/7/3,Note: The length of a string, l(), is a function that can be defined recursively, and the assertion l(xy) = l(x) + l(y) can be pr
13、oved inductively.,字符串的长度l()可以定义为: l() = 0; l( x) = l() + 1, 若x 且 * .,字符串的长度的定义,Example 8 证明l(xy) = l(x) + l(y) ,其中x, y *,字符串的长度的例题,设P(y)是命题:每当x *时就有l(xy) = l(x) + l(y) ;Basis Step: 先证明P()为真,即对所有x *来说有l(x) = l(x) + l()。易知,l(x) = l(x) = l(x) + 0 = l(x) + l(),即P()为真。Recursive Step: 假定P(y)为真,且蕴含着每当a 时,就
14、有P(ya)为真。需证明对每个a 来说有l(xya) = l(x) + l(ya):根据l()定义,有l(xya) = l(xy) + 1和l(ya) = l(y) + 1,又根据归纳假设,有l(xy) = l(x) + l(y),故得出l(xya) = l(x) + l(y) + 1 = l(x) + l(ya)。,23,2018/7/3,定义 3 递归定义根树的集合,其中根树是由一个顶点集合和连接这些顶点的边组成的,顶点集合包含的一个特殊顶点称为树根:,Solution:,Basis Step: 单个顶点r是根树。Recursive Step: 假设T1,T2,Tn是根树,分别带有树根r1
15、,r2,rn。则如下形成的图也是根树:从树根r开始,r不属于树根中T1,T2,Tn的任何一个,从r到r1,r2,rn中的每个都加一条边。,根树的集合,24,2018/7/3,建立根树,根树的集合,25,2018/7/3,定义 4 递归定义扩展二叉树的集合:,Solution:,Basis Step: 空集合是扩展二叉树。Recursive Step: 如果T1和T2都是扩展二叉树,则存在一个表示为T1 T2的扩展二叉树,它包含树根r和当左子树T1和右子树T2都非空时,连接从r到这两个子树各自的根的边。,扩展二叉树的集合,26,2018/7/3,建立扩展二叉树,扩展二叉树的集合,27,2018/
16、7/3,定义 5 递归定义满树的集合:,Solution:,Basis Step: 存在一个只含有单个顶点的满二叉树。Recursive Step: 如果T1和T2都是满二叉树,则存在一个表示为T1 T2的满二叉树,它包含树根r和连接从r到左子树T1和右子树T2各自的根的边。,满树的集合,28,2018/7/3,建立满树,满树的集合,29,2018/7/3,递 归,递归定义 引言 递归地定义函数 递归地定义集合与结构递归算法 引言 递归与迭代 归并排序,30,2018/7/3,递归算法,引言递归与迭代归并排序,31,2018/7/3,32,2018/7/3,Recursive Algorith
17、ms 递归算法,定义 1 An algorithm is called recursive if it solves a problem by reducing it to an instance of the same problem with smaller input. 若一个算法通过把问题规约到带更小的输入的相同问题的实例,来解决原来的问题,则这个算法称为递归的Once you have figured out a recursive definition for a function, one can immediately turn it into a recursive algo
18、rithm in languages (such as Java) which can handle recursion.,33,2018/7/3,procedure factorial(n: positive integer)if n=0 then factorial(n):=1else factorial(n) := nfactorial(n-1),Example 1 Give a recursive algorithm for computing the factorial function n! .给出计算阶乘n!的递归算法,递归算法的例题,34,2018/7/3,Algorithm
19、2 A Recursive Algorithm for Computing gad(a,b). procedure gcd(a,b: nonnegative integers with ab)if a=0 then gcd(a,b):=belse gcd(a,b):= gcd(b mod a,a),Example 2 Give a recursive algorithm for computing the greatest common divisor of two nonnegative integers a and b with ab.给出满足ab的两个非负整数a和b的最大公因子的递归算法
20、。,35,2018/7/3,Algorithm 3 A Recursive Linear Search Algorithm). procedure search(i, j, x)if ai=x then location:=ielse if i=j then location:=0else search(i+1, j, x),Example 3 Express the linear search algorithm as a recursive procedure.把线性搜索算法表达成递归过程,递归算法,引言递归与迭代归并排序,36,2018/7/3,递归与迭代,递归:算法容易实现,不过效率低
21、下;迭代:算法实现稍难,不过效率高;,37,2018/7/3,procedure iterative factorial (n: 正整数) x:=1For i:= 1 to n x: I x x是n!,阶乘的迭代过程,38,2018/7/3,procedure iterative fibonacci (n: 非负整数)If n=0 then y:=0ElseBegin x:=0 y:=1 for i:= 1 to n-1Begin z := x + y x := y y := zendEnd y是第n个斐波那契数,斐波那契数的迭代算法,39,2018/7/3,递归算法,引言递归与迭代归并排序,
22、40,2018/7/3,基本思想将两个或两个以上的有序子序列“归并”为一个有序序列。基本原理为将一个具有n个待排序记录的序列看成是n个长度为1的有序列,然后进行两两归并,得到n/2 个长度为2的有序序列,再进行两两归并,得到n/4 个长度为4的有序序列,如此重复,直至得到一个长度为n的有序序列为止。 在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的有序子序列归并为一个有序序列。,ri rm rm+1 rn,有序,有序,有序,ri rn,归并排序,41,2018/7/3,原理 假设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1。然后两两归并,得到n/2个长度为2
23、或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止。,初始时: 49 38 65 97 76 13 27,归并排序原理,42,2018/7/3,43,2018/7/3,如何进行两路归并? 将两个有序表的元素进行比较,小者复制到目标表中。,(5,24,35,74,222),(19,23,30),( ),两路归并,44,2018/7/3,5,24,35,74,222,(,),19,23,30,(,),(,),5,19,23,24,30,35,74,222,两路归并动画演示,s,m,t,m+1,45,2018/7/3,归并排序方法可以用递归的形式描述,即首先将待排序的记录序列
24、分为左右两个部分,并分别将这两个部分用归并方法进行排序,然后调用2-路归并算法,再将这两个有序段合并成一个含有全部记录的有序段。,归并排序的递归算法,46,2018/7/3,归并排序的递归算法,47,2018/7/3,归并排序的例子,Example 9 描述如何合并两个表2,3,4,5和1,4。,48,2018/7/3,Example 10对8,2,4,6,9,7,10,1,5,3进行归并排序。,49,2018/7/3,归并两个表,50,2018/7/3,引理 1 使用不超过m+n-1次比较,可以把带m个元素和n个元素的两个有序表合并成一个有序表。,定理 1 对一个带n个元素的表进行归并排序所需要的比较次数是O(nlogn)。,Note 事实上归并排序最好、最坏、平均时间复杂度均为O(nlogn)。,引理、定理,51,2018/7/3,本节内容到此结束,谢谢大家!,52,2018/7/3,