广工数据结构anyview第五章

5-05

/**********

【题目】试写出求递归函数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

        return n*F(n/2);

 

}

 

5-06

/**********

【题目】求解平方根 的迭代函数定义如下:

  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 temp=p*p-A;

   if(temp<0){

        temp=-temp;

   }

   if(temp<e){

    return p;

   }else if(temp>=e){

    return Sqrt(A,(p+(A/p))/2,e);

   }

}

 

5-07

/**********

【题目】已知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;

   }

   if(m==0){

    return n+1;

   }

   if(m!=0 && n==0){

      return Akm(m-1,1);

   }

   if(m!=0 && n!=0){

    return Akm(m-1,Akm(m,n-1));

   }

 

}

 

5-15

/**********

【题目】试写出求递归函数F(n)的非递归算法:

    F(n) = n+1      当n=0

    F(n) = nF(n/2)  当n>0

**********/

int F(int n)

/* 如果 n<0 则返回 -1 */

{

    int temp,sum;

if(n<0) return -1;

   if(n==0) return 0;   

   else if(n>0){

      sum=n;

      temp=n/2;

      while(temp>0){

        sum *= temp;

        temp=temp/2;

      }

      return sum;      

   }

}

 

5-16

/**********

【题目】求解平方根 的迭代函数定义如下:

  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 temp;

   temp=p*p-A;

   if(temp<0) temp = -temp;

   if(temp<e){

        return p;

   }else{  

        while(temp >=e){

           p=(p+A/p)/2;

           temp=p*p-A;

            if(temp<0) temp = -temp;

        }

        return p;

   }

}

 

5-20

/**********

【题目】假设以二维数组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    */

{

       //判断点是否越界

    if(i0<1 || i0>m || j0<1 || j0>n )  return;

    char color;

    color = g[i0][j0];

    g[i0][j0]=c;

    if(g[i0+1][j0]== color && i0+1<=m){

        ChangeColor(g,m,n,c,i0+1,j0);

    }

    if(g[i0-1][j0]== color && i0-1>=1){

        ChangeColor(g,m,n,c,i0-1,j0);

    }

    if(g[i0][j0+1]== color && j0+1<=n){

        ChangeColor(g,m,n,c,i0,j0+1);

    }

    if(g[i0][j0-1]== color && j0-1>=1){

        ChangeColor(g,m,n,c,i0,j0-1);

    }

}

 

5-30

/**********

【题目】试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。

广义表类型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 */

{

   int i,j;

   if(ls==NULL) return 1;

   if(ls->tag==ATOM) return 0;

   i=GListDepth(ls->un.ptr.hp)+1;

   j=GListDepth(ls->un.ptr.tp);

   return i>=j?i:j;

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值