重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
递归,emmmmmmm,拥有一种魅力,接近人的立即思维,容易理解,又不容易理解。
成都创新互联2013年至今,公司以成都网站建设、成都网站设计、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户千余家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。
递归算法的优点: 它使我们能够简洁地利用重复结构呈现诸多问题。通过使算法描述以递归的方式利用重复结构,我们经常可以避开复杂的案例分析和嵌套循环。这种算法会得出可读性更强的算法描述,而且十分有效。
但是 ,递归的使用要根据相应的成本来看,每次递归python解释器都会给一个空间来记录函数活动状态。但是有时候内存成本很高,有时候将递归算法转为非递归算法是一种好办法。
当然我们可以换解释器、使用堆栈数据结构等方法,来管理递归的自身嵌套,减小储存的活动信息,来减小内存消耗。
最近算法学到了递归这一块,写了三个课后习题:
给一个序列S,其中包含n个元素,用递归查找其最大值。
输出:
调和数:Hn = 1 + 1/2 + 1/3 + ··· + 1/n
输出:
例如:"12345"class 'str' 转换为12345class 'int'
输出:
递归分为线性递归、二路递归、多路递归。
首先,os是标准库的一个模块,而非函数。
递归没有什么特殊的地方,只是调用一个函数。巧的是,这个函数就是自己而已。你可以想象“查找文件”这个函数有无数个备份,而每次递归遇到就随便哪来用一个,和普通的函数调用没有什么区别。
所以,返回父目录就是在查找文件函数执行完成后执行的。
把你的手掌伸直,五指分开,从手腕开始沿着肉的边缘走一圈,最终又会回到手腕起点(忽略宽度),哪怕你的手指上又长出若干个小手指,沿着边缘走一圈,总会回到手腕。这就是递归执行的过程,每个手指就是一个递归调用。你可以在纸上画一个树状结构,设置三层目录,按照函数的调用过程来理解。
或者可以这么理解,假如国家要进行人口普查,就可以让每个省把自己的人口普查的结果回报上来,然后加起来就可以了。那么国家在加的时候,必须要等所有省都普查完后才能进行加(相当于你的返回上级目录的操作)。对于每个省来说,类似的,只要让每个市进行人口普查,然后把结果相加即可。每个省也都要等到它的所有市都普查完毕后才能相加。同理,每个市对于每个县也是同样的操作。这就是递归的过程。——但需要注意的是,所有县的普查可以同时进行,但计算机递归却是一个完成后才能进行下一个。和画手指是一样的,必须一个手指画完后才能进行下一个。
递归算法常用来解决结构相似的问题。
所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。
本质上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。
实际上,递归会将前面所有调用的函数暂时挂起,直到递归终止条件给出明确的结果后,才会将所有挂起的内容进行反向计算。其实,递归也可以看作是一种反向计算的过程,前面调用递归的过程只是将表达式罗列出来,待终止条件出现后,才依次从后向前倒序计算前面挂起的内容,最后将所有的结果一起返回。