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;
}