知识大全 《数据结构》递归算法

Posted 结点

篇首语:这个世界看你笑话的人永远比在乎你的人要多。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 《数据结构》递归算法相关的知识,希望对你有一定的参考价值。

   调用子程序的含义

  在过程和函数的学习中 我们知道调用子程序的一般形式是 主程序调用子程序A 子程序A调用子程序B 如图如示 这个过程实际上是

  

>

  @当主程序执行到调用子程序A语句时 系统保存一些必要的现场数据 然后执行类似于BASIC语言的GOTO语句 跳转到子程序A(为了说得简单些 我这里忽略了参数传递这个过程)

  @当子程序A执行到调用子程序B语句时 系统作法如上 跳转到子程序B

  @子程序B执行完所有语句后 跳转回子程序A调用子程序B语句的下一条语句(我这又忽略了返回值处理)

  @子程序A执行完后 跳转回主程序调用子程序A语句的下一条语句

  @主程序执行到结束

  做个比较 我在吃饭(执行主程序)吃到一半时 某人叫我(执行子程序A) 话正说到一半 电话又响了起来(执行子程序B) 我只要先接完电话 再和某人把话说完 最后把饭吃完(我这饭吃得也够累的了J)

   认识递归函数

  我们在高中时都学过数学归纳法 例

  求 n!

  我们可以把n!这么定义

  

>

  也就是说要求 ! 我们必须先求出 ! 要求 ! 必须先求 ! 要求 ! 就必须先求 ! 而 != 所以 != !* = 再进而求 ! ! 分别用函数表示 则如图

  

>

  我们可以观察到 除计算 !子程序外 其他的子程序基本相似 我们可以设计这么一个子程序

  int factorial(int i)

  int res;

  res=factorial(I )*i;

  return res;

  

  那么当执行主程序语句s=factorial( )时 就会执行factorial( ) 但在执行factorial( ) 又会调用factorial( ) 这时大家要注意 factorial( )和factorial( )虽然是同一个代码段 但在内存中它的数据区是两份!而执行factorial( )时又会调用factorial( ) 执行factorial( )时又会调用factorial( ) 每调用一次factorial函数 它就会在内存中新增一个数据区 那么这些复制了多份的函数大家可以把它看成是多个不同名的函数来理解;

  但我们这个函数有点问题 在执行factorial( )时 它又会调用factorial( ) 造成死循环 也就是说 在factorial函数中 我们要在适当的时候保证不再调用该函数 也就是不执行res=factorial(I )*i;这条调用语句 所以函数要改成

  int factorial(int i)

  int res;

  if (I> ) res=factorial(I )*i; else res= ;

  return res;

  

  那么求 !的实际执行过程如图所示

  

>

   如何考虑用递归的方法来解决问题

  例 求s= + + + + + +……+n

  本来这个问题我们过去常用循环累加的方法 而这里如要用递归的方法 必须考虑两点

   ) 能否把问题转化成递归形式的描述;

   ) 是否有递归结束的边界条件

  设:函数s(n)= + + +…+(n )+n

  显然递归的两个条件都有了

   ) s(n) =s(n )+n

   ) s( )=

  所以源程序为

  int progression(int n)

  int res;

  if (n= )res= else res=progression(n )+n;

  return res;

  

   递归的应用

  中序遍历二叉树

  void inorder (BinTree T)

  if (T)

  inorder(T >lchild);

  printf( %c T >data);

  inorder(T >rchild);

  

  

  现假设树如图(为了讲解方便 树很简单)

  

>

  @执行第一次调用inorder T指向顶结点 T不为空 所以第二次调用inorder ;

  @T指向顶结点的左子树结点也就是B 不为空 所以第三次调用inorder ;

  @T指向B结点的左子树结点 为空 所以什么都不执行 返回inorder ;

  @打印B结点的DATA域值 b ;

  @第四次调用inorder 去访问B子树的右结点

  @T指向B结点的右子树结点 为空 所以什么都不执行 返回inorder ;

  @返回inorder ;

  @打印A结点的DATA域值 a ;

  @第五次调用inorder 去访问A子树的右结点;

  @T指向A结点的右子树结点 为空 所以什么都不执行 返回inorder ;

  @inorder 执行完毕 返回

cha138/Article/program/sjjg/201311/23539

相关参考

知识大全 数据结构与算法设计自学考试大纲[3]

第四章栈和队列  本章介绍了栈的定义以及栈的基本操作的实现特别介绍了栈与递归的关系以及栈和递归在问题求解中的作用本章还介绍了队列的定义队列的存储桔构队列基本操作的实现特别介绍了循环队列及其应用以及其它

知识大全 数据结构考研分类复习真题 第六章 答案 (五)[36]

  ()略()根据中序和后序序列建立二叉树的递归算法见上面第题非递归算法见第题  [题目分析]采用后序非递归遍历二叉树栈中保留从根结点到当前结点的路径上的所有结点  voidPrintPath(BiT

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (五)[14]

  .试写出复制一棵二叉树的算法二叉树采用标准链接结构【山东大学二(分)】  类似本题的另外叙述有  ()已知二叉树T试写出复制该二叉树的算法(t→T)  ()(分)递归算法()(分)非递归算法【北方

知识大全 数据结构考研分类复习真题 第六章 答案 (五)[25]

  [题目分析]知二叉树中序序列与后序序列第题以递归算法建立了二叉树本题是非递归算法  voidInPostCreat(ElemTypeIN[]POST[]intlhlh)  //由二叉树的中序序列I

知识大全 实现论坛树型结构的具体算法

  作者flyblue  实现论坛树型结构的算法很多具体你可以去的全文搜索中查询我现在的JSP论坛采用的也是当中的一种不用递归实现树型结构的算法现在我将论坛树型结构的具体算法和大家介绍一下和大家一起交

知识大全 JSP页面文件目录树源码(递归算法)

JSP页面文件目录树源码(递归算法)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <%@

知识大全 数据结构考研分类复习真题 第六章 答案 (五)[12]

  [题目分析]后序遍历最后访问根结点即在递归算法中根是压在栈底的采用后序非递归算法栈中存放二叉树结点的指针当访问到某结点时栈中所有元素均为该结点的祖先本题要找p和q的最近共同祖先结点r不失一般性设p

知识大全 用递归算法判断数组a[N]是否为一个递增数组

用递归算法判断数组a[N]是否为一个递增数组  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lish

知识大全 数据结构考研分类复习真题 第三章 栈和队列[5]

  一个递归算法必须包括(   )【武汉大学二】  A递归部分     B终止条件和递归部分  &n

知识大全 用栈实现二叉树先序遍历的非递归算法实践题

  /*syc*/  #include  #include  typedefcharDataType;  typedefstructnode  DataTypedata;  structnode*lc