广工anyview数据结构习题第五章,
在学习过程中部分题目参考了Giyn 、戮漠、雁过留痕等大佬的代码,在此感谢。
题目解法不是最优解,但希望能给大家有所启发。同时也发了文档资源,需要可自取。
如果对你有帮助,可以给卑微的博主留个赞、关注、收藏 (不是)
(骗一下数据,说不定以后面试就过了,拜谢)
目录
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);
}
}