博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构5.5_广义表的递归算法
阅读量:6636 次
发布时间:2019-06-25

本文共 1829 字,大约阅读时间需要 6 分钟。

对一些可以用递归算法解决的问题,通常可以先写出问题求解的递归定义

和第二数学归纳类似,递归定义由基本项归纳项两部分组成。

 

递归定义的基本项描述了一个或几个递归过程的终结状态。虽然一个有限的递归可以描述一个无限的计算过程。

但任何实际应用的递归过程,除错误情况外,必定能经过有限层次的递归而终止。

所谓的终结状态,指的是不需要继续递归而可直接求解的状态。

 

递归定义的归纳项描述了如何实现从当前状态到终结状态的转化。

递归设计的实质是:当一个复杂问题可以分解成若干个子问题来处理时,

其中某些子问题与原问题由相同的特征属性。则可以利用与原问题相同的分析处理方法。

反之,这些问题解决了,原问题也就迎刃而解了。

递归定义的归纳项描述的是原问题与子问题的转化关系

 

递归函数的设计用的是归纳思维的方法,在设计递归函数时,应注意:

严格定义函数的功能和接口;

切忌想得太深太远;

用归纳假设进行归纳证明时,决不能怀疑归纳假设是否正确;

 

下面讨论广义表的3种操作

首先约定所讨论的广义表都是非递归表且无共享子表;

 

求广义表的深度

广义表的深度指的是广义表种括弧的重数;

空表的深度为1,因为有一对括弧;

原子的深度为0;

解题思路

1)遍历该广义表各个数据元素,求该元素的深度。如果该元素是原子,则返回深度0;如果该元素是子表,则遍历该子表的深度;

2)递归的出口状态,或者叫做终结状态:当遍历数据元素为原子时返回0,当遍历数据元素为空表时,返回1;

3)设置一个变量max用来记录数据元素中最长的深度;初始化max=0;遍历过程中max与返回的整型值进行比较,取值较大的那一个。直到程序结束。max+1就是广义表的深度;

代码实现

1 int GetGListDepth(GList L){2     if(!L) return 1;3     if(L->tag==0) return 0;4     for(int max=0, pp=L;pp;pp=pp->ptr.tp){5         dep=GetGListDepth(pp->ptr.hp);6         if(dep>max)  max=dep;7     }    8     return max+1  //非空表的深度是各元素深度最大值加19 }

 

 

复制广义表

 任何一个非空的广义表均可分解成表头和表尾。反之,一对确定的表头和表尾可唯一确定一个广义表。

由此,复制一个广义表只要分别复制其表头和表尾,然后合成即可。

复制一个广义表,也是不断的复制表头和表尾的过程。如果表头或者表尾同样是一个广义表,依旧复制其表头和表尾。

所以,复制广义表的过程,其实就是不断的递归,复制广义表中表头和表尾的过程。

 

递归的出口条件:

  如果当前遍历的数据元素为空表,则直接返回空表。

  如果当前遍历的数据元素为该表的一个原子,那么直接复制,返回即可。

 

代码实现:

1 Status CopyGList(GList &T, GList L){ 2         if(!L) T=NULL;  //直接返回空表 3         else{ 4                 if(!(T=(GList)malloc(sizeof(GLNode))))  exit(OVERFLOW);  //如果L不是空表,给T分配内存空间 5                 T->tag=L->tag; 6                 if(L->tag ==ATOM)  T->atom=L->atom; //直接复制原子 7                 else 8                 { 9                         CopyGList(T->ptr.hp, L->ptr.hp); //复制表头10                         CopyGList(T->ptr.tp, L->ptr.tp); //复制表尾11                 }12        }           return OK;13 }

 

建立广义表的存储结构

 

 

相关链接:

数据结构29:广义表的长度和深度:

数据结构30:广义表的复制:

转载于:https://www.cnblogs.com/grooovvve/p/10398313.html

你可能感兴趣的文章
爬取电影网站链接并进入网盘通过验证码下载的python(未完成)
查看>>
SRM 396(1-250pt)
查看>>
IDEA 修改页面不重启
查看>>
怎么看innodb的B+TREE层数?
查看>>
wampserver 2 添加php多版本之后,扩展不启用的解决方案
查看>>
13 RangeValidator
查看>>
Spring讲解一:Spring简介和入门
查看>>
MyBatis开发入门二:一对多连表查询
查看>>
Android学习之简单的二维码扫描功能以及回调值
查看>>
python的学习研究
查看>>
MySQL
查看>>
socket编程:简单的TCP服务器
查看>>
Bootstrap常用插件
查看>>
js获取屏幕高度宽度
查看>>
null和undefined的区别
查看>>
计算机系统概论
查看>>
使用nginx很卡之strace命令
查看>>
第一冲刺阶段站立会议07
查看>>
python-匿名函数
查看>>
x5首页显示信息
查看>>