在C语言中,所有的执行语句都只能出现在函数之中。同样,函数的调用也只能出现在某函数的函数体内。函数的调用以两种方式出现:函数的嵌套与函数的递归。 C语言中,所有函数的定义都是互相平行和独立的,一个函数的定义不能包含另一个函数的定义,即不允许函数的嵌套定义。但函数的调用可以通过用一个函数另一个函数来实现,这就形成了函数的嵌套定义!C语言不限制嵌套的个数和层数,这样我们就可以自由,合理的组织程序的模块结构
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口
(3)递归过程中必须要有逼近条件;
1fibonacci数列问题
#include<stdio.h>
static long fibonacci(int n) //内部函数
{
if(n==1||n==2)
return 1;
else
{
return fibonacci(n-2)+fibonacci(n-1);
}
}
void main()
{
int n,i;
printf("Input n.");
scanf("%d",&n);
for(i=1;i<=n;++i)/*列出每一项的值*/
{
printf("%ld",fibonacci(i));
}
}
递归方式按位输出一个整数
#include<stdio.h>
void print(int n)
{
if (n != 0)
{
print(n / 10);
printf("%d", n % 10);
}
}
int main()
{
int a = 12345;
print(a);
printf("\n");
return 0;
}
但值得注意的是 递归在调用过程中伴随着压栈等操作 过多次的递归不想看起来代码量减少变简单,而是更加复杂了 通常在return阶段执行的递归操作被称为 尾递归 ,
尾递归可以用迭代方式进行替换 大大减少了内存的压力
fibonacci数列问题的非递归实现
int _fib(int n)
{
int n1 = 1;
int n2 = 1;
int n3 = 0;
if(n <= 2)
return 1;
else
while(n>2)
{
n3 = n1 + n2;
n1 = n2;
n2 = n3;
n--;
}
return n3;
}