广工anyveiw数据结构第五章(2021.12)

广工anyview数据结构习题第五章,

在学习过程中部分题目参考了Giyn 、戮漠、雁过留痕等大佬的代码,在此感谢。

题目解法不是最优解,但希望能给大家有所启发。同时也发了文档资源,需要可自取。

如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是) 

(骗一下数据,说不定以后面试就过了,拜谢)

目录

1.DC05PE04

2.DC05PE05

3.DC05PE06

4.DC05PE07

5.DC05PE15

6.DC05PE20

7.DC05PE30

8.DC05PE32

9.DC05PE33


1.DC05PE04

试编写如下定义的递归函数的递归算法∶
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 */

#include "allinclude.h"  //DO NOT edit this line
int G(int m, int n) 
{  // Add your code here
if(m<0||n<0)
  return -1;
  
if(m==0)
return 0;
else return G(m-1,2*n)+n;

}

2.DC05PE05

试写出求递归函数F(n)的递归算法∶
F(n)= n+1               当n=0
F(n)= nF(n/2)当n>e

实现下列函数∶

int F(int n);
/* 如果n<0 则返回-1 */

#include "allinclude.h"  //DO NOT edit this line
int F(int n) 
{ // Add your code here
if(n<0)
return -1;

if(n==0)
return n+1;

else return n*F(n/2);
}

3.DC05PE06

求解平方根的迭代函数定义如下∶
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);

#include "allinclude.h"  //DO NOT edit this line
float Sqrt(float A, float p, float e) 
{  // Add your code here
float sum=p*p-A;
if(sum<0)
sum=sum*(-1);

if(sum<e)  
    return p;
 else return Sqrt(A,(p+A/p)/2,e) ;
  
}

4.DC05PE07

已知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 */

#include "allinclude.h"  //DO NOT edit this line
int Akm(int m, int n) 
{  // Add your code here

if(m<0||n<0)
  return -1;
if(m==0)
    return n+1;
else if(n==0)  
      return Akm(m-1,1);
    else return Akm(m-1,Akm(m,n-1));

}

5.DC05PE15

试写出求递归函数F(n)的非递归算法∶
F(n) = n+1              当n=0
F(n)= nF(n/2)     当n>0 

实现下列函数∶

int F(int n);

#include "allinclude.h"  //DO NOT edit this line
int F(int n) 
{ // Add your code here
  int temp = 0;
  if(n < 0)
    return -1;
  
  else if(n == 0)
          temp = n + 1;
       else
          temp = n * F(n / 2);
        
  return temp;
}

6.DC05PE20

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

#include "allinclude.h"  //DO NOT edit this line
void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0) 
{  // Add your code here
if(i0==0||j0==0||m<1||n<1)
  return ;
char oldcolor = g[i0][j0];  
  
if(i0>1 && g[i0-1][j0]==oldcolor)  
    ChangeColor(g,m,n,c,i0-1,j0);
else g[i0][j0]=c;
  
if(j0>1 && g[i0][j0-1]==oldcolor)  
    ChangeColor(g,m,n,c,i0,j0-1);
else g[i0][j0]=c; 
 

if(j0<n && g[i0][j0+1]==oldcolor)  
    ChangeColor(g,m,n,c,i0,j0+1); 
else g[i0][j0]=c;     
   
 if(i0<m && g[i0+1][j0]==oldcolor)  
    ChangeColor(g,m,n,c,i0+1,j0); 
else g[i0][j0]=c; 

}

7.DC05PE30

试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。
广义表类型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*/

#include "allinclude.h"  //DO NOT edit this line
int GListDepth(GList ls) 
{ // Add your code here
if(ls==NULL)
  return 1;
if(ls->tag==ATOM)  
  return 0;
  
int   h1,h2;
h1=GListDepth(ls->un.ptr.hp)+1;
h2=GListDepth(ls->un.ptr.tp);

return h1>h2 ? h1:h2;

}

8.DC05PE32

【题目】试编写判别两个广义表是否相等的递归算法。
广义表类型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 */

#include "allinclude.h"  //DO NOT edit this line
Status Equal(GList A, GList B) 
{  // Add your code here
if(A==NULL && B==NULL)
  return TRUE;
else if(A==NULL || B==NULL)
  return FALSE;
  
if (  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 FALSE;
}

9.DC05PE33

【题目】试编写递归算法,输出广义表中所有原子项及其所在层次。
广义表类型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表示当前层次 */

#include "allinclude.h"  //DO NOT edit this line
void OutAtom(GList A, int layer, void(*Out2)(char, int)) 
{ // Add your code here

if (A==NULL) 
  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);
  }
  
}

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛_Lin~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值