高级语言程序设计(Python)07-幻灯片-9

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

递归函数车万翔哈尔滨工业大学两个和尚的故事“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢?”“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢?”“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲什么呢?”………………………递归的定义递归:程序调用自身形式:在函数定义有直接或间接调用自身阶乘阶乘:defp(n):x=1i=1whilei=n:x=x*ii=i+1returnxn=int(raw_input(请输入一个整数:))printn,!的值为,p(n)阶乘阶乘:p(n)�!=(�−�)!×�p(n-1)p(n-1)(�−�)!=(�−�)!×(�−�)p(n-2)阶乘阶乘:else:defp(n):ifn==1orn==0:return1returnn*p(n-1)n=int(raw_input(请输入一个整数:))printn,!的值为:,p(n)阶乘p(3)defp(3):if3==1or3==0:return1else:return3*p(3-1)defp(2):if2==1or2==0:return1else:return2*p(2-1)1defifp(1):1==1or1==0:return1else:return1*p(1-1)26递归初始条件阶乘defp(n):ifn==1orn==0:return1else:returnn*p(n-1)掐头去尾留中间递归解决问题的思想if问题足够简单:直接解决问题返回解else:将问题分解为与原问题同构的一个或多个更小的问题逐个解决这些更小的问题将结果组合为,获得最终的解返回解兔子数列第一个月第二个月第三个月第四个月第五个月第六个月兔子数列斐波那契数列是这样一个数列:1,1,2,3,5,8,13,21,34,55,89……deffib(n):ifn==1orn==2:return1初始条件递归else:returnfib(n-1)+fib(n-2)斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21……斐波那契数列deffib(4):if4==1or4==2:return1else:returnfib(4-1)+fib(4-2)fib(4)deffib(3):if3==1or3==2:return1else:returnfib(3-1)+fib(3-2)deffib(1):if1==1or1==2:return1else:returnfib(1-1)+fib(1-2)deffib(2):if2==1or2==2:return1else:returnfib(2-1)+fib(2-2)递归-汉诺塔在印度,有这么一个古老的传说:开天辟地的神勃拉玛(和中国的盘古差不多的神)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面移动圆片的次数:18446744073709551615递归解决方案将前n-1个盘子,通过C,从A移动到B从A到C移动第n个盘子将前n-1个盘子,通过A,从B移动到C递归-汉诺塔定义函数hanoi(n,A,B,C)表示把A上的n个盘子移动到C上,其中可以用到Bdefhanoi(n,A,B,C):ifn==1:printMovedisk,n,from,A,to,Celse:hanoi(n-1,A,C,B)printMovedisk,n,from,A,to,Chanoi(n-1,B,A,C)n=int(raw_input(请输入一个整数:))hanoi(n,'左','中','右')路边停车随机停车长度为5的马路,平均能停多少量长度为1的汽车?随机停车长度为5的马路,平均能停多少量长度为1的汽车?随机停车随机停车随机停车随机停车当宽度w足够大时,平均停车约0.7475972w辆常数0.7475972被称作Renyi停车常数该算法巧妙的运用了递归思想,将大问题分解为更小的、独立的相似问题,然后分别加以解决许多问题能够以此方式解决递归的时间开销deffib_loop(n):ifn==1orn==2:return1else:i=2f1=1f2=1while(in):f3=f1+f2f1=f2f2=f3i=i+1returnf3deffib_recursive(n):ifn==1orn==2:return1else:returnfib_recursive(n-1)+fib_recursive(n-2)fib_loop(100)fib_recursive(100)不到0.01秒超过1小时时间都去哪了?递归的时间开销deffib(4):if4==1or4==2:return1else:returnfib(4-1)+fib(4-2)fib(4)deffib(3):if3==1or3==2:return1else:returnfib(3-1)+fib(3-2)deffib(1):if1==1or1==2:return1else:returnfib(1-1)+fib(1-2)deffib(2):if2==1or2==2:return1else:returnfib(2-1)+fib(2-2)递归的优劣分析优势(strength)它能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性特别是在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系劣势(weakness)嵌套层次深,函数调用开销大重复计算

1 / 62
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功