2015年软件水平考试程序员之程序设计知识要点(23)
发布时间:2012/5/14 9:40:35 来源:城市网学院 编辑:ziteng
6.5 返回指针的函数
函数也可以返回指向某种数据对象的指针值。界说(或声名)返回指针值函数的函数头有以下形式:
类型声名符 * 函数名(形式参数表)
例如,函数声名:
int *f(int,int);
声名函数f()返回指向int型数据的指针,该函数有两个整型形式参数。
在函数名的两侧分袂为* 运算符和()运算符,而()的优先级高于*,函数名先与()连系。函数名()是函数的声名形式。在函数名之前的* ,暗示此函数返回指针类型的值。
【例6.4】 编制在给定的字符串中找特定字符的第一次呈现。若找到,返回指向字符串中该字符的指针;否则,返回NULL值。
设函数为search(),该函数有两个形式参数,指向字符串首字符的指针和待寻找的字符。以下是函数search()的界说:
char *search(char *s,char c)
{ 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。 [NextPage] 【例6.5】用轮回实现阶乘计较的函数。
float fac(int n)
{float s;
int i;
for(s=1.of,i=l;i<=n; i++)
s*=1;
return s;
}
然而,把n! 的界说改写成以下递归界说形式
(1)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=1) 计较1! ,以结不美观1.0返回;返回到发出挪用rfac(1) 处,继续计较,获得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);/*当前元素与其余元素的和*/
}