Bootstrap

c语言递推递归题目,C语言-递推递归.ppt

C语言-递推递归

第二讲 基础算法 目录 递推 递归 排序与检索 递推 指一个序列u1,u2,u3,…,un-1,un,后面的每一项都能按公式由前面的一项或连续的几项推算出来,或者前面的每一项都能按公式由后面的一项或连续的几项推算出来。前者叫“顺推”,后者叫“逆推”。 递推 有5人坐在一起,当问第5个人多少岁,他说比第4个人大2岁,问第4个人多少岁,他说比第3个人大2岁,依此下去,问第一个人多少岁,他说他10岁,最后求第5个人多少岁? 显然可以得到如下公式: 斐波那契级数-递推的经典问题 一对新生小兔,一个月后长成中兔,从第三个月开始长成大兔并每个月生一对小兔。按此规律,一年后共有多少对兔子。 Fibnacci 数列 例-巧妙推算走楼梯 楼梯有n级台阶,如果一步走1级或2级,试问:共有多少种不同的走法? 例-巧妙推算走楼梯 总结:递推求解的基本方法: 首先,确认:能否容易的得到简单情况的解? 骨牌铺放 伯努利装错信封问题 分析思路: 得到如下递推公式: 递归 递归 递归 递归 递归 Hanoi(汉诺塔)问题:三根柱子A、B、C,其中A柱上有64个大小不等的圆盘,并且大的在下,小的在上。要求把这64个圆盘从A柱移动到C柱上,每次只能移动一个圆盘,移动时可以借助B来进行,但在任何时候,任何柱上的圆盘都必须保持大盘在下,小盘在上。求移动的过程。 递归 (1)假如只有一个盘子的话,可以直接将盘子从A柱移动到C柱,即A?C。 递归 (2)假如有两个盘子,则: A?B A?C B?C 递归 (3)假如有三个盘子,则情况开始复杂,移动顺序为: A?C A?B C?B A?C B?A B?C A?C 递归 当有n个盘子需要移动时,通常的方法如下: (1)把A柱上n-1个盘子借助C柱移动到B柱上。只有这样,C柱才能为空,则A柱上的第n个盘子(最大的那个)才能直接移动到C柱上。 (2)将A柱上的剩下的第n个盘子移动到C柱上。这个盘子已最后到位,不需要再移动了。 (3)再将B柱上的n-1个盘子借助A柱移动到C柱。 递归 void hanoi(int n,char A,char B,char C) /*借助B,把n个盘子从A移动到C*/ { if(n==1) move(A,C); else {hanoi(n-1,A,C,B); /*借助C,把n-1个盘子从A移动到B*/ move(A,C); /*把第n个盘子从A移动到C*/ hanoi(n-1,B,A,C); /*借助A,再把n-1个盘子从B移动到C*/ } } 排序与检索 查找表:用于查找的数据集合,由同一类型数据元素构成. 排序与查找 顺序查找法 顺序查找法 折半查找法(二分查找) A在心里想一个不超过1000的正整数, 由B来猜,请问可以在多少次以内猜到该数? 折半查找法 折半查找法 折半查找法 折半查找法 插入排序 直接插入排序 初始序列:[51] 33 62 96 87 17 28 51 区别相同关键字,[]内为有序序列 i=2(33) [33 51] 62 96 87 17 28 51 i=3(62) [33 51 62] 96 87 17 28 51 i=4(96) [33 51 62 96] 87 17 28 51 i=5(87) [33 51 62 87 96] 17 28 51 i=6(17) [17 33 51 62 87 96] 28 51 i=7(28) [17 28 33 51 62 87 96] 51 i=8(51) [17 28 33 51 51 62 87 96] 直接插入排序 折半插入排序 交换类排序 交换类排序:通过交换逆序元素进行排序. ◆冒泡排序 ◆快速排序 冒泡排序 冒泡排序(Bubble Sort):从头扫描待排序记录序列,在扫描过程中顺次比较相邻两个元素的大小. 冒泡排序 冒泡排序 快速排序 划分问题:从待排序记录中选取一个记录K(第一个)作为分界点。将原始序列与之比较,小于的排到K前面,大于的排到K后面。(左边的任意元素都小于或等于右边元素) 递归求解:把左右两部分分别排序(用上述方法),直到所有子表的表长不超过1。 合并问题:不用合并,此时已经是完全有序了。 快速排序 8 3 6 5 14 12 30 快速排序 void QSsort(RecordType r[],int low,int high) { if(low

;