广工anyview数据结构-07~08(乱码不贴)

本文详细介绍了多种数据结构和算法的递归及非递归实现,包括递归求解函数F(n)、平方根迭代算法、Ackerman函数、递归与非递归的二叉树遍历、颜色区域替换、二叉树相似性判断、先序遍历第k个节点、叶子节点计数等。通过这些实例,深入理解递归思想在解决复杂问题中的应用。
摘要由CSDN通过智能技术生成
/**********
【题目】试编写如下定义的递归函数的递归算法:
    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&&n==0) return 0;
   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 -1;
   else if(n>0) return F(n/2)*n;
}




/**********
【题目】求解平方根 的迭代函数定义如下:
  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)
{
   if(-e<p*p-A&&p*p-A<e) return p;
   else 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;
   else if(n==0)return 1;
   else 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)
{
   if(-e<p*p-A&&p*p-A<e) return p;
   else return Sqrt(A,(p+A/p)/2,e);
}




/**********
【题目】假设以二维数组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 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);
}




/**********
【题目】若两棵二叉树T1和T2皆为空,或者皆不空
且T1的左、右子树和T2的左、右子树分别相似,则
称二叉树T1和T2相似。试编写算法,判别给定两棵
二叉树是否相似。
二叉链表类型定义:
typedef struct BiTNode {
  TElemType  data;
  struct BiTNode  *lchild, *rchild;
} BiTNode, *BiTree;
**********/
Status Similar(BiTree T1, BiTree T2)
/* 判断两棵二叉树是否相似的递归算法 */
{
  if(!T1&&!T2)return TRUE;
  else if(T1&&T2&&Similar(T1->lchild,T2->lchild)&&Similar(T1->rchild,T2->rchild)) return TRUE;
  else return FALSE;
}





/**********
【题目】编写递归算法,求对二叉树T先序遍历时
第k个访问的结点的值。
二叉链表类型定义:
typedef struct BiTNode {
  TElemType data;
  struct BiTNode  *lchild, *rchild;
} BiTNode, *BiTree;
**********/
int countNodes(BiTree bt){   
    return bt?(1 + countNodes(bt->lchild)+countNodes(bt->rchild)):0;
  }
TElemType PreOrderK(BiTree T, int k)
/* 求对二叉树T先序遍历时第k个访问的结点的值。*/
/* 若失败,则返回'#'                         */
{
    int count;     
    if(k <=0||!T) return '#';
    if(k==1) return T->data;
    count=countNodes(T->lchild);
    return count>=--k?PreOrderK(

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值