一直在疑惑为什么dep没有规定初值,而且也没有dep++,那递归GLDepth不也没用吗?请各位神仙指点一二
广义表的深度可以通过递归实现。假设广义表的数据结构如下:
typedef struct GLNode{
int tag;
union{
char data;
struct GLNode *sublist;
}val;
struct GLNode *next;
}GLNode, *GList;
其中,tag为0表示该元素是原子,tag为1表示该元素是子表。
求广义表的深度GLDepth可以通过如下代码实现:
int GLDepth(GList g){
if(g == NULL){ //空表深度为0
return 0;
}
if(g->tag == 0){ //原子深度为1
return 1;
}
int max_depth = 0;
/* 遍历子表,求出最大深度 */
GLNode *p = g->val.sublist;
while(p != NULL){
int depth = GLDepth(p);
if(depth > max_depth){
max_depth = depth;
}
p = p->next;
}
return max_depth + 1; //子表深度为最大深度加1
}
在递归过程中,dep并没有规定初值,是因为每次递归调用GLDepth时,都会重新定义一个dep变量,所以没有必要初始化。同时,也没有dep++,是因为每次递归调用GLDepth时,都会返回一个新的dep值,所以也不需要自增操作。
广义表的深度可以使用递归算法来计算,其中每个递归调用会将深度增加1,并继续递归计算子表的深度,直到没有子表为止。以下是一个简单的伪代码实现:
int GLDepth(GList g){
if(g is empty){
return 0;
} else if(g is an atom){
return 1;
} else { // g is a list
int max_depth = 0;
for each sub_list in g{
int sub_depth = GLDepth(sub_list);
if(sub_depth > max_depth){
max_depth = sub_depth;
}
}
return max_depth + 1;
}
}
在这个实现中,dep参数没有规定初始值,因为每个递归调用都会创建一个新的栈帧来保存dep的值。在每个递归调用中,dep的值都会根据当前子表的深度增加1,并在递归调用返回后自动恢复到上一层递归调用的值。
因此,递归GLDepth函数的参数dep不需要递增,而是在每个递归调用中通过传递一个新的参数值来记录当前深度。