资源简介 4.3 非数值计算 第4单元 计算与问题解决 学 习 目 标 3.体验递归算法,并结合具体问题开展编程实践。 2.了解算法设计中的分治思想,并运用二分查找解决实际问题。 1.运用合适的算法形成解决问题的方案。 二分查找法的理解和运用二分法解决实际问题。 (重点) 递归算法的实际应用,并针对具体问题开展编程实践。 (难点) 运行Python编写的“猜数字”游戏,计算机在0~1000中随机产生一个数,试试看你要多少次才能猜中。 假设一本书大约300页,目标信息在第132页。请在下表记录 你的翻页过程,和同学们比一比,看谁翻的次数最少。 {5C22544A-7EE6-4342-B048-85BDC9FD1C3A}次数 翻至页码 下一步决策 第1次 第2次 第3次 第4次 …… 分治策略 分治的设计思想,是将一个难以直接解决的大问题,分割成一些较小的同类问题,各个击破,最终达到解决问题的目的。二分查找实际上就是分治策略的一种典型运用。 二分查找 二分查找又叫折半查找,该方法主要将数列有序排列,采用跳跃式的方式查找数据。二分查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。 以递增数列为例,先以中点位置的元素作为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。每一次比较后都可以将查找区间缩小-半。 二分法查找的前提条件是被查找的数据必须是有序的。 查找的基本算法有: 顺序查找、二分查找、 分块查找、哈希查找等 有了翻书的经验,我们尝试完善下面的二分查找程序。 x=int(input("请输入要查找的1000以内的整数:")) step=0 #记录查找次数 flag1=1 #目标区域左边界 flag2=1000 #目标区域左边界 while( ): #区间数据范围小于1则结束循环 mid=( ) #中间值 ( ) #查找次数加1 if mid>x: ( ) #右边界前移 elif mid ( ) #左边界后移 else: break print("查找次数为:",step) #找到目标数据,退出循环 input("运行完毕,请按回车键退出...") #输出次数 (flag1<=flag2) (flag1+flag2)//2 step=step+1 flag2=mid-1 flag1=mid+1 二分查找 “汉诺塔”游戏源于一个古老的印度传说。如图所示,在木板上有A、B、C三根杆,A杆上有若干木盘,规定每次移动一个木盘。且小的木盘只能叠在大的木盘上面。请设计算法,用尽可能少的次数把所有的木盘从A杆全部移到C杆上。完成课本P102图4.3.2汉诺塔的移动过程。 递归 直接或间接地调用自身的方法称为递归。 递归是计算科学领域中一种重要的计算思维模式。它既是一种抽象表达的手段,也是一种问题求解的重要方法。 递归 以下是一个四叶草的代码及运行结果 图4.3.3 递归图像 递归 在数学与计算机领域中,递归函数是指用函数自身定义该函数的方法。 递归的要素: 1.递推关系的递归的重要组成 2.边界条件。它保证递归能在有限次的计算后得出结果,而不会产生无限循环的情况。 递归 递归的基本思想:把规模较大的问题层层转化为规模较小的同类问题求解。对递归而言,递推与回归,二者缺一不可。 结合分治策略,递归也可以用“分”“治”“合”三个字概况 递归 分:将原有问题分解成K个子问题。 治:对这K个子问题分别求解。如果子问题的规模仍然不够小,则将其再分解为K个子问题,如此进行下去,直到问题足够小时,就很容易求出子问题的解。 合:将求出的小规模问题的解合并为一个更大规模问题的解,自下而上逐步求出原问题的解。 递归 汉诺塔的递归过程: 将N个木盘从A杆移动到C杆,需要借助中间的B杆,只要超过一个木盘,在移动过程中,总会存在起始杆、过渡杆及目标杆的问题。因此,定义函数时,用到了4个参数:haooi(n,s,m,t),n表示需要移动的盘子数量,S表示盘子的起始杆,m表示中间过渡杆,t表示目标杆。可用下图表示: 递归 汉诺塔递归程序如下: def hanno(n,s,m,t): #定义一个函数,n层塔,将盘子从s借助m移动到t if n==1: print(s,'-->',t) #将一个盘子从s移动到t else: hanno(n-1,s,t,m) #将前n-1个盘子从s移动到m上 print(s,'-->',t) #将最底下的最后一个盘子从s移动到t上 hanno(n-1,m,s,t) #将m上的n-1个盘子移动到t上 #主程序 n=int(input('请输入汉诺塔的层数:'))#调用函数,将n个木盘从A借助B移动到C hanno(n,'A','B','C') input("运行完毕,请按回车键退出...") 递归 输入不同的层数,查看运行结果 递归 计算“汉诺塔”游戏移动的次数。 参考答案: def f(n): if n==0: return 0 else: return 2*f(n-1)+1 x=int(input("请输入塔的个数:")) print("需要移动",f(x),"次") input("运行完毕,请按回车键退出...") 递归 根据提示输入不同的塔数,查看移动的次数 递归 迭代算法与递归算法都需要重复执行某些代码,两者既有区别又有密切的联系。 迭代 重复方式:是重复反馈过程的活动,其目的通常是逼迫所需目标或结果。 结束方式:通常使用计数器结束循环。 递归 重复方式是重复调用函数自身。 结束方式:遇到满足终止条件的情况时逐层返回。 递归与迭代的关系 利用Python调试运行课本P106表4.3.2递归与迭代,查看比较结果。 巩固练习 展开更多...... 收起↑ 资源预览