/**********
【题目】试编写如下定义的递归函数的递归算法:
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;
else if (m == 0 && n >= 0) return 0;
else if (m > 0 && n >= 0) return G(m - 1, 2 * n) + n;
}
/**********
【题目】试写出求递归函数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 if (n > 0) return n * F(n / 2);
}
/**********
【题目】求解平方根 的迭代函数定义如下:
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 error = (p * p - A) < 0 ? -(p * p - A) : (p * p - A);
if (error < e) return p;
return Sqrt(A, (p + A/p)/2, e);
}
/**********
【题目】已知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 if (m != 0 && n != 0) return Akm(m-1, Akm(m, n-1));
}
/**********
【题目】试写出求递归函数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;
int res = 1;
while (n) {
res *= n;
n /= 2;
}
return res;
}
/**********
【题目】求解平方根 的迭代函数定义如下:
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)
{
while (((p * p - A) < 0 ? -(p * p - A) : (p * p - A)) >= e) {
p = (p + A/p)/2;
}
return p;
}
/**********
【题目】假设以二维数组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 temp;
if(i0 <1|| i0 > m || j0 <1|| j0 > n)
return;
temp = g[i0][j0];
if(c == temp)
return;
g[i0][j0]= c;
if(i0-1 >= 1 && g[i0-1][j0] == temp)
ChangeColor(g, m, n, c, i0-1, j0);
if(i0+1 <= m && g[i0+1][j0] == temp)
ChangeColor(g, m, n, c, i0+1, j0);
if(j0-1 >= 1 && g[i0][j0-1] == temp)
ChangeColor(g, m, n, c, i0, j0-1);
if(j0+1 <= n && g[i0][j0+1] == temp)
ChangeColor(g, m, n, c, i0, j0+1);
}
/**********
【题目】试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。
广义表类型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 */
{
if (!ls) return 1;
if (ls->tag == ATOM) return 0;
return GListDepth(ls->un.ptr.hp)+1 > GListDepth(ls->un.ptr.tp) ? GListDepth(ls->un.ptr.hp)+1 : GListDepth(ls->un.ptr.tp);
}
/**********
【题目】试编写判别两个广义表是否相等的递归算法。
广义表类型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 && !B || 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 0;
}
/**********
【题目】试编写递归算法,输出广义表中所有原子项及其所在层次。
广义表类型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 (!A) 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);
}