C递归函数(一):简单介绍
普通函数调用
我们先来看一个简单的函数调用例子:
#include <stdio.h>
//定义一个简单的打印函数 print_num
void print_num(int n)
{
printf("n = %d\n",n);
}
int main()
{
int i=5;
print_num(i);//调用print_num函数
return 0;
}
运行结果:
n = 5
先序递归函数
ok,现在我们对这个C程序进行一些改造:
#include <stdio.h>
void print_num(int n)
{
if(n>0)//如果n>0执行下面代码块
{
printf("n = %d\n",n);//先打印当前n的值
n--;//再执行n-1
print_num(n);//再自己调用自己,这种函数就叫递归函数
}
}
int main()
{
int i=5;
print_num(i);
return 0;
}
运行结果:
n = 5
n = 4
n = 3
n = 2
n = 1
我们现在来分析下:
- 程序进入运行到main函数,i=5,然后调用print_num函数,传入参数n=5;
- 程序进入print_num函数,先进行条件判断,n=5,所以先打印n=5,然后n-1,n变为4;
- 再一次进入到print_num函数,同上,先判断,n=4,所以打印n=4,然后n-1,n变为3;
- 重复以上操作,分别打印n=3,n=2,n=1,这时候n-1,n变为0;
- 再一次进去到print_num函数,判断n是否大于0,若不大于0,接下来不进行任何操作,print_num函数结束
我们把这种递归函数叫先序递归。
后序递归函数
我们再来改造下之前的代码:把printf放在递归之后
#include <stdio.h>
void print_num(int n)
{
if(n>0)//如果n>0执行下面代码块
{
n--;//再执行n-1
print_num(n);//再自己调用自己,这种函数就叫递归函数
printf("后序n = %d\n",n);//再调用自己之后再打印n的值
}
}
int main()
{
int i=5;
print_num(i);
return 0;
}
运行结果:
后序n = 0
后序n = 1
后序n = 2
后序n = 3
后序n = 4
我们发现后序打印的n的值居然是倒过来的,并且打印的值是0到4。
这似乎不太好理解,我们来屡一下思路:
- 程序进入运行到main函数,i=5,然后调用print_num函数,传入参数n=5;
- 程序进入print_num函数,先进行条件判断,n=5,然后n-1,n变为4,没有执行printf;
- 再一次进入到print_num函数,先判断,n=4,然后n-1,n变为3,没有执行printf;
- 再一次进入到print_num函数,先判断,n=3,然后n-1,n变为2,没有执行printf;
- 再一次进入到print_num函数,先判断,n=2,然后n-1,n变为1,没有执行printf;
- 再一次进入到print_num函数,先判断,n=1,然后n-1,n变为0,没有执行printf;
- 这个时候n不大于0了,不再执行if语句块里的print_num,这个时候来执行printf函数!
- 现在n=0,printf打印出"后序n=0",print_num函数里面是包含printf的,但是之前执行了几次都没有打印,欠在那了,现在要还回来
- 最开始的打印是后序n=0,接下来就是后序n=1…
- 这就叫后序递归!我们发现后序递归的代码是逆序执行的!
总结
- 函数在内部调用自己,就叫做递归函数
- 在递归函数之前的代码叫先序递归,是顺序执行的
- 在递归函数之后的代码叫后序递归,是逆序执行的