资源简介 (共19张PPT)5.2.2递归递归算法现在,我们把问题反过来思考f(5)=f(4)*5f(4)=f(3)*4f(3)=f(2)*3f(2)=f(1)*2f(1)=f(0)*1递推问题逐渐缩小回归大问题的解决中嵌套着与原问题相似的规模较小的问题。这种解决问题的方式在计算机科学中称为递归,通过函数自己调用自己来实现,即一个函数在其定义中直接或间接调用自身的一种方法。递归算法1.大问题能分解成结构相似且规模较少的问题,这些小问题的阶可以方便地构造出大问题的解;2.当递归到达某个边界时,当递归到达某个边界,如问题规模缩减为0或1时,能直接得解。这个边界被称为递归出口。·能采用递归算法解决的问题特征因此,在设计递归算法时,要满足两个条件:确定递归公式和递归结束条件。递归算法1(n=0)n*f(n-1)(n>0)f(n)5!= 5 * 4!4!= 4 * 3!3!= 3 * 2!2!= 2 * 1!1!= 1 * 0!0!= 1递推:分解问题回归:代值求解任务一:利用递归思想设计一个函数f,用来计算5的阶乘def f(n):if n==0:___________else:___________return ff=1f=n*f(n-1)算法时间复杂度为:O(n)递归算法递归程序的执行过程1.在递推阶段,把较复杂的问题的求解递推到一些简单问题的求解。必须要有终止递推的情况。2.在回归阶段,当获得最简单情况的解后,逐级返回依次得到稍复杂问题的解。递归算法1*fac(0)2*fac(1)3*fac(2)4*fac(3)5*fac(4)fac(1)fac(2)fac(3)fac(4)fac(5)通过不断的调用自己缩小问题规模,进而求解。空间复杂度大用栈实现递归:递归算法迭代:由旧值不断推出新值的过程。它包括三个方面:①确定迭代变量;②建立迭代关系式;③控制迭代过程,使程序能够停止下来。递归:是一种缩小问题规模,进而构造出整个问题解的思想方法。①递推 ②回归迭代难点:建立正确的迭代公式,通常要借助循环语句。递归难点:思想比较难以理解,递归程序的效率相对不高。辨析迭代与递归:递归算法——汉诺塔游戏汉诺塔游戏汉诺塔游戏的装置是一块铜板,上面有三根针,其中最左侧一根针上放着从大到小的n个圆盘。游戏的目标是把所有的圆盘从最左侧一根针上移动到最右侧一根针上,中间一根针作为过渡。游戏规定每次只能移动一个圆盘,并且大盘子不能压在小盘子上面。递归算法——汉诺塔游戏汉诺塔游戏启始针A过渡针B目标针C一个盘子:二个盘子:三个盘子呢?n个盘子呢?将n-1个盘子从A柱经过C柱移动到B柱将A柱中剩下的一个盘子移动到C柱将n-1个盘子从B柱经过A柱移动到C柱n-1个看成一个整体A->C2号:A->B1号:A->C2号:B->C递归算法——汉诺塔游戏将n-1个盘子从A柱经过C柱移动到B柱将A柱中剩下的一个盘子移动到C柱将n-1个盘子从B柱经过A柱移动到C柱【设计算法】1.定义一个实现盘子移动的函数move。如将n个盘子从A柱经过B柱移动到C柱,可调用函数move(n, a, b, c),其中,n表示A柱上的盘子个数,a、b、c分别表示A柱、B柱、C柱。2.当n=1时,直接移动盘子,递归结束。move(n-1, a, c, b)move(1, a, b, c)move(n-1, b, a, c)递归算法——汉诺塔游戏def move(n, a, b, c):if ____________:print(a, "--->", c)else:move(n - 1, a, c, b)move(1, a, b, c)____________a = int(input("请输入A柱盘子的个数:"))print(f"把{a}个盘子全部移动到C柱子的顺序为:")move(a, "A", "B", "C")n == 1move(n-1, b, a, c)递归算法——进制转换编写程序,输入两个正整数 x,y(y<=l6),实现将十进制数x 转换为十六进制y输出。迭代程序def convert(n,base):convert_s = "0123456789ABCDEF"ans=""while n>0:x=______________________________________n=n // basereturn ansx=int(input("请输入x:"))y=int(input("请输入y:"))print(convert(x,y))n %baseans= convert_s[x] + ans递归算法——综合应用为了防止黑客恶意破解密码、机器恶意注册或刷票等不良行为,很多网络平台使用验证码作为一种通行方式。小明给自己的网站平台设计了如下验证码功能:首先计算机随机生成一个[1,100000]范围内的整数作为验证码,用户通过计算该整数各位数字的和并输入验证,只有验证通过才能正常登录。例如,若计算机产生的随机数为21304,则用户只有输入10(2+1+3 +0+4=10)才能正常登录。递归算法——综合应用【算法分析】该验证码功能需要从随机数x中分解出各位数字并求和。由于随机数x的位数不确定,而任何整数x的个位数一定可以通过x%10得到,剩下的(x//10)可以采用递归算法进行分解。通过函数fenjie(x)先将x的各位数字分解并存入数组ans,再求得和sumx,最后将sumx与用户输入的信息进行比对,输出响应的提示信息,请完善以下代码。递归算法——综合应用import randomdef fenjie(x):if x<10:ans.append(x)else:ys=x%10____________fenjie(x)ans.append(ys)x=random.randint(1,100000)print("随机产生的整数为:",x)y=int(input("请输入你的运算结果:"))ans=[]fenjie(x)sumx=0for i in ans:___________if _______________:print("验证通过!")else:print("输入错误!")x=x//10sumx+=isumx==y课堂小结递归的必要条件递归的适用情况递归的定义函数的递归调用是指一个函数在它的函数体内,直接或间接地调用它自身,称为递归调用。这种函数称为递归函数。确定递归条件寻找递归出口问题在规模小时能够直接得出答案可以通过同一套规则转化为比该问题更为简单的子问题。练一练1.递归算法的函数调用时,处理参数和返回地址通常使用的数据结构是( )A.数组B.队列C.栈D.链表C练一练2.楼梯上有8级台阶,从下开始往上走,每次可以走一步或者两步,自定义函数fg可以计算走完n级台阶有多少种走法。实现对应功能的Python程序如下:def fg(n):if n==1:return 1elif n==2:return 2else:return fg(n-1)+fg(n-2)Print(‘走完8级台阶的方法共有’,fg(8),‘种’)则走完这8级台阶的走法有( )A.34种 B.35种 C.36种 D.37种ATHANK YOUSpeaker :wps powerpoint 展开更多...... 收起↑ 资源预览