1、函数的嵌套调用
嵌套定义是在定义一个函数时,其函数体内又包含另一个函数的完整定义。
然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。
例:
main()
{
a();
}
a()
{
b();
}
b()
{
return;
}
例题:计算s=2²!+3²!
思路:(1)可编写两个函数,一个是用来计算平方值的函数square,另一个是用来计算阶乘值的函数factorial。
(2)主函数先调square计算出平方值,再在square中以平方值为实参,调用factorial函数计算其阶乘值,再返回主函数,在循环程序中计算累加和。
#include <stdafx.h> #include<stdio.h> long square(int p); long factorial(int q); void main() { int i; long s=0; for(i=2;i<=3;i++) { s=s+square(i); } printf("%ld ",s); } long square(int p) { int k; long r; k=p*p; r=factorial(k); return (r); } long factorial(int q) { long c=1; int i; for(i=1;i<=q;i++) { c*=i; } return c; }
2、递归
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。
例:int flint (x)
{
int y,z;
z=flint(y);
return (2*z);
}
注:递归函数必须要有一个退出条件!
例:用递归的方法求n!
思路:求n!也可用递归的方法,即5!=4!*5,4!=3!*4……可用如下递归公式表示:
n=1 (n=0,1)
n*(n-1)! (n>1)
#include <stdafx.h> #include<stdio.h> long recusion(int n); void main() { int n; long result; printf("input a integer number: "); scanf("%d",&n); result=recusion(n); printf("%d!=%ld ",n,result); } long recusion(int n) { long tomp_result; if(n<0) { printf("n<0,input error! "); } else if(n==0||n==1) { tomp_result=1; } else { tomp_result=n*recusion(n-1); } return tomp_result; }
注:递归算法是效率低下的算法,但有些问题却只能用递归算法才能实现。如:Hanoi塔问题。