首页>计算机>软件水平考试>复习指导>正文
高级语言程序设计知识点 六

www.zige365.com 2010-7-28 10:46:12 点击:发送给好友 和学友门交流一下 收藏到我的会员中心

   { while(*s && *s! = c) 
   s++;
   return *s?s:NULL;
   }

   6.6  函数递归调用

    一个函数为完成它的复杂工作,可以调用其它别的函数。例如,从主函数出发,主函数调用函数A() ,函数A()又调用函数B(),函数B()又调用函数C(),等等。这样从主函数出发,形成一个长长的调用链,就是通常所说的函数嵌套调用。函数嵌套调用时,有一个重要的特征:先被调用的函数后返回。如这里所举例子,待函数C()完成计算返回后,B()函数继续计算(可能还要调用其它函数) ,待计算完成,返回到函数A(),函数A()计算完成后,才返回到主函数。
       当函数调用链上的某两个函数为同一个函数时,称这种函数调用方式为递归调用。通过速归调用方式完成其功能的函数称为递归函数。许多问题的求解方法具有递归特征,用递归函数描述这种求解算法比较简洁。计算n的阶乘(n!)函数就是一个很好的例子。因
      n! = l*2*3* …*n

按其定义用循环语句可以方便地实现,写成函数见下例6.5。
【例6.5】用循环实现阶乘计算的函数。
    float fac(int n)
    {float s;
    int i;
    for(s=1.of,i=l;i<=n; i++)
    s*= l;
    return s;
    }
    然而,把n! 的定义改写成以下递归定义形式
 (l)n!=1, n<=l;
 (2)n!= n*(n-1)!, n>l。
根据这个定义形式可用递归函数描述如下例6.6。

【例6.6】 用递归实现阶乘计算的函数。
   float rfac(int n) 
   {
   if( n<=1) return 1.0f;
   return n*rfac(n-1) ;
   }
   以计算3! 为例,说明递归函数被调用时的执行过程。设有代码m= rfac(3) 调用函数rfac()。函数调用rfac(3) 的计算过程可大致叙述如下:
        以函数调用rfac(3) 去调用函数rfac() ;函数rfac(n=3) 为计算3*2! ,用rfac(2) 去调用函数rfac();函数rfac(n=2) 为计算2*1!,用rfac(1)去调用函数rfac();函数 rfac(n=l) 计算1! ,以结果1.0返回;返回到发出调用rfac(l) 处,继续计算,得到2! 的结果2.0返回;返回到发出调用rfac(2) 处,继续计算得到3! 的结果6.0返回。
    递归计算n! 有一个重要特征,为求n有关的解,化为求n-l的解,求n-1的解又化为求n-2的解,如此类推。特别地,对于1的解是可立即得到的。这是将大问题解化为小问题解的递推过程。有了1的解以后,接着是一个回溯过程,逐步获得2的解,3的解,……,直至n的解。
【例6.7】 用递归函数实现数组元素的求和计算。
    要采用递归方法计算数组元素的和,可把数组元素的累计和等于当前元素与数组其余元素的和,而对数组其余元素的和通过递归实现。下面的函数定义是这样的解法之一。
  int rsum(int *a, int n) 
  { 
  if( n==0) return 0;/*若数组没有元素,则返回0*/
  return *a+rsum(a+l,n-1);/*当前元素与其余元素的和*/
   } 

本新闻共5页,当前在第5页  1  2  3  4  5  

我要投稿 新闻来源: 编辑: 作者:
相关新闻
高级语言程序设计知识点 五
高级语言程序设计知识点 四
高级语言程序设计知识点 三
高级语言程序设计知识点 二