递归及递归算法.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归的实现及应用 1.递归:一个直接调用自己或通过一系列的调用语句间接的调用自己的函数,称做递归. 分为直接递归和间接递归 在递归函数的递归调用过程中,当有多个函数构成嵌套调用时,函数之间的信息传递和控制转移必须通过栈来实现。 2.用递归解决的问题:   其一:数学函数采用递归定义如:阶乘函数 Fact(n)= 1 n=0 n · Fact(n-1) n>0  其二:有的数据结构,如二叉树,广义表,图的遍历,查找算法等由于结构本身固有的递归特性,其操作可以递归的描述;  其三:没有明显的递归结构但用递归求解更简单,如Hanoi塔问题求解.    3、递归程序的一般形式 Status function (参数表);   long fact(int n) { { If 数据为递归出口 if (n <=0)    简单操作; return(1); else{ 简单操作 else  function(实参表); return n × fact(n-1) ;     简单操作;  } } } 4、递归程序的编写 首先,要确定本程序的功能描述(定义)及各变量的含义,确定递归出口及描述,然后分别进行以下两方面的设计: (1)写出程序中与递归出口相对应的操作; (2)写出在非递归出口处所对应的操作:先假设在数据(参数及全局变量)接近递归出口时,程序功能正确,可通过适当调用这些功能来实现本程序的功能,这些操作的描述便构成了这部分的程序。 (3)通过条件语句将上述两部分操作连接起来,便得到整个程序。 printf(T->data) ; InOrderTraverse ( T->lchild ) ; InOrderTraverse ( T->rchild ) ; If (T) { } // return OK void InOrderTraverse ( BiTree T ) { } //中序遍历 算法 中序遍历递归算法(或其他遍历算法) 树的递归算法思路拓展 设计算法 由此导出许多实用的算法:如求二叉树的高度, 度为0,1,2的结点数,二叉树的相似、复制等。 例1 .设计算法:统计一棵二叉树中所有叶结点的数目 void Count(BiTree bt) //统计二叉树bt上叶子结点数 n {if(bt= = NULL ) return 0; {if (bt->lchild==null && bt->rchild==null) return 1; //叶子 结点 return Count(bt->lchild)+ Count(bt->rchild ); } 例2试写出复制一棵二叉树的算法。二叉树采用 二叉链表存储 。 .BiTree Copy(BiTree t)//复制二叉树t {BiTree bt; if (t= =null) bt=null; else{bt=(BiTree)malloc(sizeof(BiNode)); bt->data=t->data; bt->lchild=Copy(t->lchild); bt->rchild=Copy(t->rchild); } return(bt); }//结束Copy 例3 :用孩子兄弟链表作为树的存储结构,请编写求树的深度的算法。 分析:一棵树的深度定义为:若树为空,则深度为0,否则树的深度为所有子树深度的最大值加1。 A D C B A D C B 结点类型定义为:type struct node {char data; struct node *fristchild , *nextbrother }Csnode, *CSTree fristchild 指向结点的第一个孩子结点,nextbrother指向结点的右邻兄弟结点。 由孩子兄弟链表表示的树,求高度

文档评论(0)

178****4446 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档