/**********
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;
}
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;
}
sqrt(A,p,e) = p 当|pp-A|
其中,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));
}
/**********
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;
}
/**********
sqrt(A,p,e) = p 当|pp-A|
其中,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;
}
/**********
区域,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);
}
}
/**********
广义表类型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;
}
/**********
广义表类型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;
}
/**********
广义表类型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);
}
}
}