第五章
一、根据给定的递归函数编写递归算法
【题目】试编写如下定义的递归函数的递归算法:
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) {
if(m < 0||n < 0) return -1;
if(m == 0&&n >= 0) return 0;
else return G(m-1,2*n)+n;
}
二、根据给定的递归函数F(n)编写递归算法
【题目】试写出求递归函数F(n)的递归算法:
F(n) = n+1 当n=0
F(n) = nF(n/2) 当n>0
实现下列函数:
int F(int n);
/* 如果 n<0 则返回 -1 */
#include "allinclude.h" //DO NOT edit this line
int F(int n) {
if(n < 0) return -1;
if(n == 0) return n+1;
else return n*F(n/2);
}
三、利用递归算法求解平方根
【题目】求解平方根 的迭代函数定义如下:
sqrt(A,p,e) = p 当|pp-A|<e
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);
#include "allinclude.h" //DO NOT edit this line
float Sqrt(float A, float p, float e) {
if(A < 0||e < 0) return -1;
float p1;
if(p*p > A) p1 = p*p-A;
else p1 = A-p*p;
if(p1 < e) return p;
else return Sqrt(A,(p+A/p)/2,e);
}
四、请写出Ackerman函数的递归算法
【题目】已知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) {
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));
}
五、试写出求递归函数F(n)的非递归算法
【题目】试写出求递归函数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) {
if(n < 0) return -1;
int i,m;
m = 1;
for(i = n;i > 0;i /=2) m *= i;
return m;
}
六、试写出求解平方根的非递归算法
【题目】求解平方根 的迭代函数定义如下:
sqrt(A,p,e) = p 当|pp-A|<e
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);
#include "allinclude.h" //DO NOT edit this line
float Sqrt(float A, float p, float e) {
if(A < 0||e < 0) return -1;
float p1 = p*p-A;
if(p1 < 0) p1 = -p1;
while(p1 >= e){
p = (p+A/p)/2;
p1 = p*p-A;
if(p1 < 0) p1 = -p1;
}
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 */
#include "allinclude.h" //DO NOT edit this line
void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0) {
if(i0 < 1||j0 < 1||i0 > m||j0 > n) return;
char color;
color = g[i0][j0];
g[i0][j0] = c;
if(i0-1 >= 1&&g[i0-1][j0] == color) ChangeColor(g,m,n,c,i0-1,j0);
if(j0-1 >= 1&&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);
if(j0+1 <= n&&g[i0][j0+1] == color) 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 */
#include "allinclude.h" //DO NOT edit this line
int GListDepth(GList ls) {
int h1,h2;
if(!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 */
#include "allinclude.h" //DO NOT edit this line
Status Equal(GList A, GList B) {
//如果都是空表
if(!A&&!B) return TRUE;
else if(A&&B){
//如果不是空表,先看是不是原子
if(ATOM == A->tag&&ATOM == B->tag){
if(A->un.atom == B->un.atom) return TRUE;
else return FALSE;
}else if(LIST == A->tag&&LIST == 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;
}
return FALSE;
}
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表示当前层次 */
#include "allinclude.h" //DO NOT edit this line
void OutAtom(GList A, int layer, void(*Out2)(char, int)) {
if(!A) return ;
if(A){
if(ATOM == A->tag) Out2(A->un.atom,layer);
else{
OutAtom(A->un.ptr.hp,layer+1,Out2);//表头,layer要加一
OutAtom(A->un.ptr.tp,layer,Out2);//表尾
}
}
}