求广义表g的深度c语言

一直在疑惑为什么dep没有规定初值,而且也没有dep++,那递归GLDepth不也没用吗?请各位神仙指点一二

img

内容来源与ChatGpt4及newbing和百度:


广义表的深度可以通过递归实现。假设广义表的数据结构如下:

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不需要递增,而是在每个递归调用中通过传递一个新的参数值来记录当前深度。