递归算法详解.pdf

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归算法详解.pdf

递 归 冯文科 一、递归的基本概念。 一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引 用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须 用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。在程序设计 中,函数直接或间接调用自己,就被称为递归调用。 二、递归的最简单应用:通过各项关系及初值求数列的某一项。 在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简单, 于是人们想出另一种办法来描述这种数列:通过初值及a 与前面临近几项之间的关系。 n 要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各 项的关系。 比如阶乘数列 1、2、6、24、120、720…… 如果用上面的方式来描述它,应该是: ⎧1,n=1 a = ⎨ n na ,n1 ⎩ n−1 如果需要写一个函数来求a 的值,那么可以很容易地写成这样: n int f(int n) { if(n==1) return 1; return n*f(n-1); } 这就是递归函数的最简单形式,从中可以明显看出递归函数都有的一个特点:先处理一 些特殊情况——这也是递归函数的第一个出口,再处理递归关系——这形成递归函数的第二 个出口。 递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为 特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问 题的解。 以上面求阶乘数列的函数 f(n)为例。如在求 f(3)时,由于3不是特殊值,因此需要计 算3* f(2),但 f(2)是对它自己的调用,于是再计算 f(2),2 也不是特殊值,需要计算 2* f(1),需要知道 f(1)的值,再计算 f(1),1是特殊值,于是直接得出 f(1)=1,返回上 1 一步,得 f(2) = 2* f(1)= 2,再返回上一步,得 f(3)= 3* f(2)= 3*2= 6,从而得最 终解。 用图解来说明,就是 f(3)的执行过程 f(2)的执行过程 f(1)的执行过程 (特殊值判断:) (特殊值判断:) (特殊值判断:) 3≠1,继续向下。 2≠1,继续向下。 1=1,由特殊情 (递归关系处理:) (递归关系处理:) 况出口直接返回1。 求3* f(2),需要先 求2* f(1),需要先 计算 f(2),调用 f(2), 计算 f(1),调用 f(1), 且本身挂起…… 且本身挂起…… …… …… …… …… 得到 f(2) = 2,由正 得到 f(1)=1,由正 常出口返回3*2 常出口返回2*1 下面再看一个稍复杂点的例子。 【例1】数列{a }的前几项为 n 1 1 1 1、 、 、 、…… 1+1 1 1

文档评论(0)

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

1亿VIP精品文档

相关文档