《计算思维与C语言概述》_第七章.pptxVIP

  • 0
  • 0
  • 约1.06万字
  • 约 52页
  • 2026-01-30 发布于广东
  • 举报

7.1递归

递归(recursion)是计算科学领域的一种重要的思维模式,是一种问题求解的方法。例如,数学公式n!=1×2×···×n的计算可以取n-1次乘法的结果,也可以采用另一种思维方法———n!=n(n-1)!。也就是说,给定n,则n!可由(n-1)!求出,(n-1)!可由(n-2)!求出,···,2!可由1!求出。而1!=1已知,那么2!可求得,从而3!可求得,依次类推,n!可求得。这种思维方式便是一种递归。递归思维将复杂的计算简化为简单计算的不断重复,是最重要的计算思维。在C/C++语言中,递归的实现是采用函数的自我调用来实现。函数直接(或间接)调用自己就称为函数的递归调用,这种函数就称为递归函数。递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,就一层一层地由里到外返回。调用自身的过程又称为“递推”,由里到外返回的过程又称为“回归”,所以递归过程可以分为“递推”和“回归”两个阶段。下一页返回

7.1递归

本节以一个简单示例为基点,阐述应用递归的程序设计过程。【例7-1】用递归函数编写计算阶乘n!的函数factorial。【分析】阶乘n!的计算公式如下:根据上面阶乘的计算公式可以发现,阶乘的计算公式是一个递归计算公式。为了计算n!,需要调用计算阶乘的函数factorial(n),它因要计算(n-1)!,而调用factorial(n-1),于是形成递归调用。这个过程一直持续到1!为止。在求得1!=1以后,逐层返回,最后求得n!。上一页下一页返回

7.1递归

算法的伪代码如下:(1)输入一个自然数,存入变量n;(2)递归调用函数factorial;(3)输出n!的值;上一页下一页返回

7.1递归

7.1.1递归的思想递归是程序设计中的一种常见方法。采用递归方法编写程序可以使程序更加简洁、清晰、容易理解。阶乘问题是一个经典的数学递归问题。为了得到n!,操作步骤如下(注意参数的变化):(1)第1次调用函数factorial(n)。根据公式可知:n!=n×(n-1)!。所以,需要知道(n-1)!的数值,那么就需要第2次调用函数factorial。(2)第2次调用函数factorial(n-1)。根据公式可知:(n-1)!=(n-1)×(n-2)!。所以,需要知道(n-2)!的数值,那么就需要第3次调用函数factorial。(3)第3次调用函数factorial(n-2)。根据公式可知:(n-2)!=(n-2)×(n-3)!。所以,需要知道(n-3)!的数值,那么就需要第4次调用函数factorial。上一页下一页返回

7.1递归

直到调用函数factorial(2),都可采用同样的方法进行处理,2!=2×1!。根据公式可知:1!=1。因此,问题最终可以求解。可以看出,每次面对的问题在本质上是同一个问题,只是问题的规模不同。上面的解决方法体现了递归的思想,将复杂问题分解为规模较小的子问题,且子问题和原问题本质上是相同的问题。在将子问题求解后,原问题也将求解。接下来,以求解5!为例,说明递归的递推过程和回归过程。上一页下一页返回

7.1递归

7.1.2递归的递推求解5!的递推过程如下:(1)求解5!,即调用factorial(5)。当进入factorial()函数体后,由于形参n的值为5,不等于1,所以执行factorial(n-1)?n,即执行factorial(4)?5。为了求得这个表达式的结果,必须先调用factorial(4),并暂停其他操作。换言之,在得到factorial(4)的结果之前,不能进行其他操作。(2)调用factorial(4)时,实参为4,形参n也为4,不等于1,因此将继续执行factorial(n-1)?n,即执行factorial(3)?4。为了求得这个表达式的结果,必须先调用f

文档评论(0)

1亿VIP精品文档

相关文档