5-05
/**********
【题目】试写出求递归函数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
return n*F(n/2);
}
5-06
/**********
【题目】求解平方根 的迭代函数定义如下:
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 temp=p*p-A;
if(temp<0){
temp=-temp;
}
if(temp<e){
return p;
}else if(temp>=e){
return Sqrt(A,(p+(A/p))/2,e);
}
}
5-07
/**********
【题目】已知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;
}
if(m==0){
return n+1;
}
if(m!=0 && n==0){
return Akm(m-1,1);
}
if(m!=0 && n!=0){
return Akm(m-1,Akm(m,n-1));
}
}
5-15
/**********
【题目】试写出求递归函数F(n)的非递归算法:
F(n) = n+1 当n=0
F(n) = nF(n/2) 当n>0
**********/
int F(int n)
/* 如果 n<0 则返回 -1 */
{
int temp,sum;
if(n<0) return -1;
if(n==0) return 0;
else if(n>0){
sum=n;
temp=n/2;
while(temp>0){
sum *= temp;
temp=temp/2;
}
return sum;
}
}
5-16
/**********
【题目】求解平方根 的迭代函数定义如下:
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 temp;
temp=p*p-A;
if(temp<0) temp = -temp;
if(temp<e){
return p;
}else{
while(temp >=e){
p=(p+A/p)/2;
temp=p*p-A;
if(temp<0) temp = -temp;
}
return p;
}
}
5-20
/**********
【题目】假设以二维数组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 */
{
//判断点是否越界
if(i0<1 || i0>m || j0<1 || j0>n ) return;
char color;
color = g[i0][j0];
g[i0][j0]=c;
if(g[i0+1][j0]== color && i0+1<=m){
ChangeColor(g,m,n,c,i0+1,j0);
}
if(g[i0-1][j0]== color && i0-1>=1){
ChangeColor(g,m,n,c,i0-1,j0);
}
if(g[i0][j0+1]== color && j0+1<=n){
ChangeColor(g,m,n,c,i0,j0+1);
}
if(g[i0][j0-1]== color && j0-1>=1){
ChangeColor(g,m,n,c,i0,j0-1);
}
}
5-30
/**********
【题目】试按依次对每个元素递归分解的分析方法重写求广义表的深度的递归算法。
广义表类型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 i,j;
if(ls==NULL) return 1;
if(ls->tag==ATOM) return 0;
i=GListDepth(ls->un.ptr.hp)+1;
j=GListDepth(ls->un.ptr.tp);
return i>=j?i:j;
}