C++编程《第10课 复杂递归》教学课件.pptxVIP

  • 0
  • 0
  • 约4.03千字
  • 约 33页
  • 2026-03-10 发布于广西
  • 举报

C++编程《第10课 复杂递归》教学课件.pptx

第10课复杂递归

学习目标强化加深对递归的理解和运用运用递归解决复杂的问题学习目标强化加深对递归的理解和运用运用递归解决复杂的问题

知识讲授

汉诺塔问题汉诺塔(河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔问题

问题建模我们可以使用4个参数去描述汉诺塔问题。voidHanoi(intn,chara,charb,charc);n表示移动的是第n号盘子;a,b,c分别表示汉诺塔问题中的三个柱子。我们称a,b,c分别为:起始柱,辅助柱,目标柱。注意a、b、c都必须是变量而不能是常量。思考一下原因?

汉诺塔问题A

递推关系根据游戏规则:想要移动n号盘,则需要先将n-1号盘(其实是n以上所有的盘)从a柱移动到b柱。此时我们的问题变成:Hanoi(n-1,a,c,b);即:将n-1号盘从a柱出发,借助c柱,移动到b柱。在这次移动的过程中a,c,b分别为:起始柱,辅助柱,目标柱。

将n-1号盘子移到b柱之后,我们就可以将n号盘子,直接从a移动到c,即n-1:a-c。到这一步,我们完成了第n号盘子的移动。接下来我们还需要将n-1号盘子(在b柱),移动到c柱上。即:Hanoi(n-1,b,a,c);在这次移动的过程中b,a,c分别为:起始柱,辅助柱,目标柱。递推关系

当问题变成只有一个盘子时,我们就无须借助辅助柱,直接从a移动到c柱即可。边界条件

#includebits/stdc++.husingnamespacestd;voidHanoi(intn,chara,charb,charc){if(n==1){coutn:a-cendl;return;}else{Hanoi(n-1,a,c,b);coutn:a-cendl;Hanoi(n-1,b,a,c);}}intmain(){Hanoi(3,a,b,c);return0;}参考代码

快速排序(Quicksort)快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分(分治法),其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

排序过程初始数组a[]47652311234567第1遍处理时,先取L=1,R=7,key=a[L],i=L,j=R。ij升序排序,以key作为基准,将数组划分成左边都小于等于key,右边都大于等于key的两部分。

初始数组a[]47652311234567先从右往左找,找到第一个比key=4要小的值位置。将a[j]的值赋值给a[i]。ij当ij时,重复如下过程:排序过程

初始数组a[]17652311234567再从左往右找,找到第一个比key=4要大的值位置。将a[i]的值赋值给a[j]。ij排序过程

初始数组a[]17652371234567重复刚才的过程:再从右往左找,找到第一个比key=4要小的值位置。将a[j]的值赋值给a[i]。ij排序过程

初始数组a[]13652371234567从左往右找,找到第一个比key=4要大的值位置。将a[i]的值赋值给a[j]。ij排序过程

初始数组a[]13652671234567从右往左找,找到第一个比key=4要小的值位置。将a[j]的值赋值给a[i]。ij排序过程

初始数组a[]13252671234567从左往右找,找到第一个比key=4要大的值位置。将a[i]的值赋值给a[j]。ij排序过程

初始数组a[]13255671234567从左往右找,找不到比key小的值,i==j时,循环结束,再将key的值,赋值给a[i]。ij排序过程

初始数组a[]13245671234567从左往右找,找不到比key小的值,i==j时,循环结束,再将key的值,赋值给a[i]。ij排序过程

初始数组a[]13245671234567经过第一轮划分,数组被分成{1,3,2,4}和{5,6,7}两个部分,再分别对这两部分执行上述的过程。ij排序过程

#includebits/stdc++.husingnamespacestd;inta[8]={0,4,7,6,

文档评论(0)

1亿VIP精品文档

相关文档