广工 AnyviewC 数据结构习题 第五章

广工 AnyviewC 数据结构习题 第五章

  • 广工 AnyviewC 数据结构习题 第五章
    • 1【题目】试编写如下定义的递归函数的递归算法:
    • 2【题目】试写出求递归函数F(n)的递归算法:
    • 3【题目】求解平方根 的迭代函数定义如下:
    • 5【题目】试写出求递归函数F(n)的非递归算法:
    • 6【题目】求解平方根 的迭代函数定义如下:
    • 7【题目】假设以二维数组g[1..m][1..n]表示一个图像
    • 8【题目】试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。
    • 9【题目】试编写判别两个广义表是否相等的递归算法。
    • 10【题目】试编写递归算法,输出广义表中所有原子项及其所在层次。

广工 AnyviewC 数据结构习题 第五章

/**********

1【题目】试编写如下定义的递归函数的递归算法:

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;
    if (m == 0)
        return 0;
    return G(m-1,2*n)+n;
}

2【题目】试写出求递归函数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 n+1;
    if (n >0)
        return n*F(n/2);
    return -1;
}

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

sqrt(A,p,e) = p 当|pp-A| sqrt(A,p,e) = sqrt(A,(p+A/p)/2,e) 当|pp-A|>=e
其中,p是A的近似平方根,e是结果允许误差。试写出相
应的递归算法。

float Sqrt(float A, float p, float e)
{
    float re;
    if ((p*p-A) < 0)
        re =  -(p*p-A);
    else
        re = (p*p-A);
    if (re < e)
        return p;
    else
        return Sqrt(A,(p+A/p)/2,e);
}

/**********
##4【题目】已知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
        return Akm(m - 1,Akm(m,n - 1));
}

/**********

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

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

**********/

int F(int n)
/* 如果 n<0 则返回 -1 */
{
    int first, i, num,sum;
    int* f;
    f = (int*) malloc ((n+1) * sizeof(int));
    if (n < 0)
        return -1;
    if (n == 0)
        return n + 1;
    else
    {
        first = 1;
        num = 0;
        do
        {
            
            if ((num / 2) == 0)
            {
                num++;
                sum = first;
                f[num] = sum;
                
            }
            else
            {
                first = f[num / 2];
                sum = num * first;
                f[num] = sum;
            }
            num++;
        } while (num<=n);
    }
    return sum;
}

/**********

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

sqrt(A,p,e) = p 当|pp-A| sqrt(A,p,e) = sqrt(A,(p+A/p)/2,e) 当|pp-A|>=e
其中,p是A的近似平方根,e是结果允许误差。试写出相
应的非递归算法。
**********/

float Sqrt(float A, float p, float e)
{
    float first = A / 2;
    float re; 
    if (p*p-A < 0)
        re = -(p*p - A);
    else
        re = p*p - A;
    
    if (re < e)
        return p;
    else
    {
        do
        {
            p = (p + A / p)/ 2;
            if (p*p-A < 0)
                re = -(p*p - A);
            else
                re = p*p - A;
        } while (re >= e);
    }        
    return p;
}

/**********

7【题目】假设以二维数组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 color = g[i0][j0];
    if(g[i0][j0]==c) 
        return;
    else{
        g[i0][j0] = c;
        if(j0-1>=1&&g[i0][j0-1]==color) ChangeColor(g,m,n,c,i0,j0-1);
        if(i0-1>=1&&g[i0-1][j0]==color) ChangeColor(g,m,n,c,i0-1,j0);
        if(j0+1<=n&&g[i0][j0+1]==color) ChangeColor(g,m,n,c,i0,j0+1);
        if(i0+1<=m&&g[i0+1][j0]==color) ChangeColor(g,m,n,c,i0+1,j0);
        
    }    

}

/**********

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

广义表类型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 h1, h2;
	if (NULL == ls)
		return 1;
	if (ATOM == ls->tag)
		return 0;
	h1 = GListDepth(ls->un.ptr.hp) + 1;
	h2 = GListDepth(ls->un.ptr.tp);
	return h1 >= h2 ? h1 : h2;
}

/**********

9【题目】试编写判别两个广义表是否相等的递归算法。

广义表类型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 == NULL && B == NULL)
		return TRUE;
	else if (A != NULL && B != NULL)
	{
		if (ATOM == A->tag && ATOM == B->tag)
		{
			if (A->un.atom == B->un.atom)
			{
				return TRUE;
			}
			else
				return FALSE;
		}
		else if (LIST == A->tag && A->tag == B->tag)
		{
			if (Equal(A->un.ptr.hp, B->un.ptr.hp) && Equal(A->un.ptr.tp, B->un.ptr.tp))
			{
				return TRUE;
			}
			else
				return FALSE;
		}
		else
			return FALSE;
	}
	else
		return FALSE;
}

/**********

10【题目】试编写递归算法,输出广义表中所有原子项及其所在层次。

广义表类型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 (NULL != A)
    {
        if (A->tag == ATOM)
        { 
            Out2(A->un.atom, layer);           
        }
        else
        {           
            OutAtom(A->un.ptr.hp, layer+1, Out2);           
            OutAtom(A->un.ptr.tp, layer, Out2);            
        }
    }
}

你可能感兴趣的:(AnyviewC)