数据结构vl怎么求_数据结构递归

递归的定义

在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。

若调用自身,称之为直接递归。

若过程或函数A调用过程或函数B,而B又调用A,称之为间接递归。

在算法设计中,任何间接递归算法都可以转换为直接递归算法来实现,所以主要讨论直接递归。

如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,称为尾递归。

以下是求n!(n为正整数)的递归函数。它属于什么类型的递归。

解:直接递归函数。又由于递归调用是最后一条语句,所以它又属于尾递归。

e13ce79fc46c4f08f08cc8c4ff21c325.png

递归算法通常通常把一个大的复杂问题层层转化为一个或多个与原问题相似的规模较小的问题来求解。

递归策略只需少量的代码就可以描述出解题过程所需要的多次重复计算,大大减少了算法的代码量。

e9b979a5d80bb4ed0ea38f5a0831b085.png

一般来说,能够用递归解决的问题应该满足以下3个条件:

需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。

递归调用的次数必须是有限的。

必须有结束递归的条件来终止递归。

何时使用递归

有许多数学公式、数列等的定义是递归的。例如,求n!和Fibonacci(斐波那契)数列等。

1e253fd4ff955f403dde7cdd381a82dc.png

数据结构是递归的

有些数据结构是递归的。如单链表就是一种递归数据结构。

ac080ea81926cad32162c76622f6a592.png

求一个不带头结点单链表p中所有data成员(假设为int型)之和。

ed4ab4eec77f5a9f1fe99c09a7b9e971.png

问题的求解方法是递归的

4ff967bf7aabb8e06295b7067b5c5cc8.png

设Hanoi(n,x,y,z)表示将n个盘片从x塔座借助y塔座移动到z塔座上

824040e07ec6b289216fc2cf7dc6b060.png
8c0a33fdd215c793c95c52661fc22ad8.png
a027cddcbe026a62c9eb38fb168b42d0.png

一般地,一个递归模型是由递归出口和递归体两部分组成。

递归出口确定递归到何时结束,即指出明确的递归结束条件。

递归体确定递归求解时的递推关系。

38de7700f3dc29df6bc7a50e05d48e31.png

递归出口的一般格式如下:

429ff30686cc13545031a8cfe900d22a.png

递归体的一般格式如下:

52065ea1f72d4732f3c16616097e0843.png

递归与数学归纳法

采用数学归纳法证明1+2+…+n=n(n+1)/2

3022375fdc7da77519c3858242a6e56e.png
94547864b52d6121983b823de5490ffa.png

递归的执行过程

658cd3aded4d9ab7e5d8e14c1d85b261.png

遇到递归出口发生“质变”,原递归问题便转化成可以直接求解的问题。

求值过程:

d1c84e5725d14ba74149939886cd84c8.png

例如:求5!。

acb2d487c91d4d0b640bfa0ec864ffe3.png

系统内部如何执行递归算法

一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。

为了保证递归函数的正确执行,系统需设立一个工作栈。

(1)执行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址。

(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址进栈。

(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。

例如,有以下程序段:

e638ae30fbcfa496022cd244f5ec905b.png

程序执行时使用一个栈来保存调用过程的信息,这些信息用main()、S(0)和S(1)表示,那么自栈底到栈顶保存的信息的顺序是怎么样呢?

6cf37376698f57ceeade9a03bee3c27e.png

用递归算法的形参值表示状态,由于递归算法执行中系统栈保存了递归调用的值参、局部变量和返回地址。

所以在递归算法中一次递归调用后会自动恢复该次递归调用前的状态。

23e0cefa61027c143455c864b364c7fb.png
8704c42d64c8b3ec2e0cde0b2c582908.png

递归算法的时空分析

递归算法执行过程不同于非递归算法,所以其时空分析也不同于非递归算法。

非递归算法分析是定长时空分析。

递归算法分析就是变长时空分析。

递归算法的时间分析

2edd37ed657820ccfe54b5baa2fe2d07.png
abb7ef22de64ac012389a38e6e27ff8a.png
ec457265801228241a91e145b4ef4386.png

递归算法的空间分析

20e382c148a20cb9e69c3d5611c89949.png
a7072dc6a03a562c4aeff75cf4ae910c.png
32ebc416bae003da97d5f4bb981223b5.png

递归算法分析

37c02b11f4bde0d7e97ecb0c7c04abcb.png

递归算法设计的步骤

设计求解问题的递归模型。

转换成对应的递归算法。

4419d85a050b14caec83b3f6c7f75395.png

 求递归模型的步骤如下:

ac017b84aee644f2e82c031b248da09e.png

采用递归算法求整数数组a[0..n-1]中的最小值。

b6fda540bd38dff6fbed87596f7328bb.png
e192a8f0ac81845147758fdc5fc108b7.png

基于递归数据结构的递归算法设计

ec59d34c4a36e4f0cab27be7161e52c4.png

假设有一个不带头结点的单链表p,完成以下两个算法设计:

(1)设计一个算法正向输出所有结点值。

(2)设计一个算法反向输出所有结点值。

ce07fe8ca218770f4a22cbe6dfb00451.png

(1)正向输出

501570c7c83454cd45b4f4e76e5a0cf0.png

(2)反向输出

b048e93794db4bf44eae97a820930dc4.png
417eff2c27abf86e9a56d55a5fecfd88.png

基于归纳方法的递归算法设计

通过对求解问题的分析归纳来转换成递归方法求解(如皇后问题等)。

关键是对问题本身进行分析,确定大、小问题解之间的关系,构造合理的递归体,而其中最重要的又是假设出“合理”的小问题。

例子:若算法pow(x,n)用于计算xn(n为大于1的整数)。完成以下任务:

(1)采用递归方法设计pow(x,n)算法。

(2)问执行pow(x,10)发生几次递归调用?求pow(x,n)对应的算法复杂度是多少?

ea6618f5774c05adf4005441622aa9d0.png
7075109b78ce38f1b9ba9b048d88dbea.png

例子:创建一个n阶螺旋矩阵并输出。例如,n=4时的螺旋矩阵如下:

f27761e5edbc96536606662642df3497.png

答案:

ff9c49215e5bf404d291005352d8b0c2.png
f68bb65b0f422a06756b615aba989491.png
b189fa01fb6b5ab585cfce23a059aa4a.png
870893ed18342a583468e52954bf21d8.png

例子:采用递归算法求解迷宫问题,并输出从入口到出口的所有迷宫路径。

df8dd499505397c3ea0eba8d919abc3c.png
c77b37fac5d6f407304d6b5be336a08f.png
3053a42cacba81934346e501281a2b6d.png
68bb62bccbb52bd6aec5cc6a90988ef2.png
ee1535d01bc91d48bb16abb1972584ef.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值