函数的嵌套调用
C语言的函数定义是互相平行和独立的,但函数的调用是可以嵌套的,也就是说,在调用一个函数的过程中,又去调用另外一个函数。
例:编写程序,使用函数嵌套定义计算 1! 2! 3! … n!。
参考代码:
代码语言:javascript复制#include <stdio.h>
long fac(int n);
long sum(int n);
int main()
{
printf("1! 2! 3! = %ldn", sum());
printf("1! 2! 3! 4! = %ldn", sum());
printf("1! 2! 3! 4! 5! = %ldn", sum());
return ;
}
/* fac函数计算n! */
long fac(int n)
{
long f = ;
int i;
for(i=; i<=n; i )
{
f = f * i;
}
return f;
}
/* sum求1! 2! 3! … n! */
long sum(int n)
{
int i;
long s = ;
for(i=; i<=n; i )
{
s = s fac(i);
}
return s;
}
结果示例:
函数的递归调用
递归是指函数直接或间接的调用自己的过程。C语言的特点之一就是允许函数的递归调用,即在函数体中直接或间接的调用函数自身。如果一个函数直接调用了自己,称为直接递归;如果一个函数调用了其他函数,而被调用的函数又调用了主调函数,则称为间接递归。
递归调用的函数在定义时需要满足两个条件:
(1) 有一个或多个终止状态,即最简单的情况,用于结束递归调用。
(2) 每次递归调用都必须简化当前问题的求解,使问题越来越接近终止状态,最终达到终止状态。
特别强调,如果递归方法定义时没有恰当的满足上面两个条件,可能会造成无限递归,最终使内存资源耗尽而中止程序。
例:使用函数递归调用实现将一个正整数输出其二进制形式,例如,输入10,输出1010
思路分析:将十进制的正整数转换成其二进制形式输出,可以采用“除2取余,逆序排列”方法。具体方法是,用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位,后得到的余数作为二进制数的高位,依次排列起来。
参考代码:
代码语言:javascript复制 #include <stdio.h>
void dtob(int n);
int main()
{
printf("10的二进制形式: ");
dtob(10);
printf("n");
printf("100的二进制形式: ");
dtob(100);
printf("n");
printf("255的二进制形式: ");
dtob(255);
printf("n");
return 0;
}
void dtob(int n)
{
if(n/2 > 0)
{
dtob(n/2);
}
printf("%d", n%2);
}
结果示例: