第07章--函数概要.ppt

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

* * * * * * * * * * * * * * 显然这是一个递归问题。要求第5个人的年龄,就必须先知道第4个人的年龄,而第4个人的年龄也不知道,要求第4个人的年龄必须先知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1个人的年龄。而且,每一个人的年龄都比其前一个人的年龄大2岁。见下页: * 从上图中可以看出,求解过程可分为两个阶段来完成:第一阶段是“回推”, 即将第n个人的年龄表示为第(n-1)个人年龄的函数,而第(n-1)个人的年龄仍然不知道,还要“回推”到第(n-2)个人的年龄… … ,直到第一个人的年龄。此时age(1)已知,不必向前推了。然后开始第二个阶段,采用递推的方法,也就是从第1 个人的已知年龄推算出第2个人的年龄,从第2个人的年龄再推算出第3个人的年龄… … ,一直推算出第5个人的年龄(18岁)为止。也就是说,一个递归的问题可以分为“回推”和“递推”两个阶段。而且要经历许多步才能求出最后的值。 显而易见,如果要求递归过程不是无限制进行下去,就必须有一个结束递归过程条件。例如,象age(1)=10就是一个递归条件。 * 从上图中可以看到,age函数共计被调用了5次。其中age(5) 是main函数调用的,其余4次是在age 函数中调用的,即递归调用4次。 在此处应强调的是:在某一次调用age函数时并不是立即得到age(n)的值,而是一次又一次地进行递归调用,到age(1)时才有确定的值,然后再递推出age (2)、age(3)、age(4)、age(5)。 * 显然这是一个递归问题。要求第5个人的年龄,就必须先知道第4个人的年龄,而第4个人的年龄也不知道,要求第4个人的年龄必须先知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1个人的年龄。而且,每一个人的年龄都比其前一个人的年龄大2岁。见下页: * 从上图中可以看到,age函数共计被调用了5次。其中age(5) 是main函数调用的,其余4次是在age 函数中调用的,即递归调用4次。 在此处应强调的是:在某一次调用age函数时并不是立即得到age(n)的值,而是一次又一次地进行递归调用,到age(1)时才有确定的值,然后再递推出age (2)、age(3)、age(4)、age(5)。 现在换一个角度考虑问题,n! 不仅是 1*2*3* ... *n 还可以定义成 n! = 当 n=0 n*(n-1)! 当 n0 按照该定义,n! 就是一个简单的条件语句和表达式计算,可以编出如下函数: float factorial ( int n ) { if ( n==0 ) return 1; else return n*factorial(n-1); } 问题:在函数 factorial 内又调用函数 factorial 本身,行吗? 回答:行! 首先按作用域规则,在函数 factorial 内又调用函数 factorial 本身是合法的;其次 C 系统保证上述调用过程执行的正确性,这就是递归。 从静态行文角度看,在定义一个函数时,若在定义它的内部,又出现对它本身的调用,则称该函数是递归的,或递归定义的。 从动态执行角度看,当调用一个函数时,在进入相应函数,还没退出(返回)之前,又再一次的调用它本身,而再一次进入相应函数,则称之为递归,或称之为对相应函数的递归调用。 称递归定义的函数为递归函数。上述函数 factorial 就是递归函数。若计算 5! ,使用函数调用factorial(5) ,观察其计算过程: return 5*f(4) f(5) f=120 f(4) f(3) f(2) f(1

文档评论(0)

yaocen + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档