2021 广工 Anyview 数据结构第 5 章

/**********
【题目】试编写如下定义的递归函数的递归算法:
    g(m,n) = 0             当m=0,n>=0
    g(m,n) = g(m-1,2n)+n   当m>0,n>=0
**********/
int G(int m, int n) 
/* 如果 m<0 或 n<0 则返回 -1 */
{
    if (m < 0 || n < 0) return -1;
    else if (m == 0 && n >= 0) return 0;
    else if (m > 0 && n >= 0) return G(m - 1, 2 * n) + n;    
}
/**********
【题目】试写出求递归函数F(n)的递归算法:
    F(n) = n+1      当n=0
    F(n) = nF(n/2)  当n>0
**********/
int F(int n)
/* 如果 n<0 则返回 -1 */
{
    if (n < 0) return -1;
    else if (n == 0) return n + 1;
    else if (n > 0) return n * F(n / 2);    
}
/**********
【题目】求解平方根 的迭代函数定义如下:
  sqrt(A,p,e) = p                   当|p*p-A|<e
  sqrt(A,p,e) = sqrt(A,(p+A/p)/2,e) 当|p*p-A|>=e
其中,p是A的近似平方根,e是结果允许误差。试写出相
应的递归算法。
**********/
float Sqrt(float A, float p, float e)
{
    float error = (p * p - A) < 0 ? -(p * p - A) : (p * p - A);
    if (error < e) return p;
    
    return Sqrt(A, (p + A/p)/2, e);
}
/**********
【题目】已知Ackerman函数的定义如下:
   akm(m,n) = n+1                 当m=0
   akm(m,n) = akm(m-1,1)          当m!=0,n=0
   akm(m,n) = akm(m-1,akm(m,n-1)) 当m!=0,n!=0
请写出递归算法。
**********/
int Akm(int m, int n)
/* 若 m<0 或 n<0 则返回-1  */
{
    if (m < 0 || n < 0) return -1;    
    else if (m == 0) return n + 1;    
    else if (m != 0 && n == 0) return Akm(m-1, 1);
    else if (m != 0 && n != 0) return Akm(m-1, Akm(m, n-1));
}
/**********
【题目】试写出求递归函数F(n)的非递归算法:
    F(n) = n+1      当n=0
    F(n) = nF(n/2)  当n>0
**********/
int F(int n)
/* 如果 n<0 则返回 -1 */
{
    if (n < 0) return -1; 
    int res = 1;    
    while (n) {
        res *= n;        
        n /= 2;    
    }
    return res;
}
/**********
【题目】求解平方根 的迭代函数定义如下:
  sqrt(A,p,e) = p                   当|p*p-A|<e
  sqrt(A,p,e) = sqrt(A,(p+A/p)/2,e) 当|p*p-A|>=e
其中,p是A的近似平方根,e是结果允许误差。试写出相
应的非递归算法。
**********/
float Sqrt(float A, float p, float e)
{
    while (((p * p - A) < 0 ? -(p * p - A) : (p * p - A)) >= e) {
        p = (p + A/p)/2;
    }
    return p;
}
/**********
【题目】假设以二维数组g[1..m][1..n]表示一个图像
区域,g[i][j]表示该区域中点(i,j)所具颜色,其值
为从0到k的整数。试编写递归算法,将点(i0,j0)所在
区域的颜色置换为颜色c。约定与(i0,j0)同色的上、
下、左、右的邻接点为同色区域的点。

表示图像区域的类型定义如下:
typedef char GTYPE[m+1][n+1];
**********/
void ChangeColor(GTYPE g, int m, int n, 
                 char c, int i0, int j0)
/* 在g[1..m][1..n]中,将元素g[i0][j0] */
/* 所在的同色区域的颜色置换为颜色c    */
{
    char temp;
    if(i0 <1|| i0 > m || j0 <1|| j0 > n)
        return;    
    temp = g[i0][j0];
    if(c == temp)
        return;
    g[i0][j0]= c;

    if(i0-1 >= 1 && g[i0-1][j0] == temp)
        ChangeColor(g, m, n, c, i0-1, j0);
    if(i0+1 <= m && g[i0+1][j0] == temp)
        ChangeColor(g, m, n, c, i0+1, j0);
    if(j0-1 >= 1 && g[i0][j0-1] == temp)
        ChangeColor(g, m, n, c, i0, j0-1);
    if(j0+1 <= n && g[i0][j0+1] == temp)
        ChangeColor(g, m, n, c, i0, j0+1);
}
/**********
【题目】试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。
广义表类型GList的定义:
typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode{
     ElemTag tag;
     union {
       char atom;
       struct { 
         GLNode *hp, *tp;
       } ptr;
     }un;
} *GList;
**********/      
int GListDepth(GList ls)
/* Return the depth of list */
{
    if (!ls) return 1;
    if (ls->tag == ATOM) return 0;
    
    return GListDepth(ls->un.ptr.hp)+1 > GListDepth(ls->un.ptr.tp) ? GListDepth(ls->un.ptr.hp)+1 : GListDepth(ls->un.ptr.tp);
}
/**********
【题目】试编写判别两个广义表是否相等的递归算法。
广义表类型GList的定义:
typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode{
     ElemTag tag;
     union {
       char atom;
       struct { 
         GLNode *hp, *tp;
       } ptr;
     }un;
} *GList;
**********/
Status Equal(GList A, GList B)
/* 判断广义表A和B是否相等,是则返回TRUE,否则返回FALSE */
{
    if (!A && !B || A->tag==ATOM && B->tag==ATOM && A->un.atom==B->un.atom) return TRUE;    
    if (A->tag==LIST && B->tag==LIST) return Equal(A->un.ptr.hp, B->un.ptr.hp) && Equal(A->un.ptr.tp, B->un.ptr.tp);

    return 0;
}
/**********
【题目】试编写递归算法,输出广义表中所有原子项及其所在层次。
广义表类型GList的定义:
typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode{
     ElemTag tag;
     union {
       char atom;
       struct { 
         GLNode *hp, *tp;
       } ptr;
     }un;
} *GList;
**********/
void OutAtom(GList A, int layer, void(*Out2)(char, int))
/* 递归地用函数Out2输出广义表的原子及其所在层次,layer表示当前层次 */
{
    if (!A) return;    
    if (A->tag==ATOM) Out2(A->un.atom, layer);
    else if (A->tag==LIST) OutAtom(A->un.ptr.hp, layer+1, Out2), OutAtom(A->un.ptr.tp, layer, Out2);
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值