递归
C允许函数调用它自己,这种调用过程就叫做递归。可以使用循环的地方通常可以使用递归。有时用循环解决问题比较好,有时用递归更好。递归方案更加简洁,但效率却没有循环高。
演示递归
#include <stdio.h>
void up_and_down(int n);
int main()
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n location %p\n",n,&n); //#1
if(n < 4)
up_and_down(n + 1);
printf("LEVEL %d: n location %p\n",n,&n); //#2
}
输出结果:
Level 1: n location 0x0012ff48
Level 2: n location 0x0012ff3c
Level 3: n location 0x0012ff30
Level 4: n location 0x0012ff24
LEVEL 4: n location 0x0012ff24
LEVEL 3: n location 0x0012ff30
LEVEL 2: n location 0x0012ff3c
LEVEL 1: n location 0x0012ff48
从结果中我们可以看到:在if(n < 4)语句成立的条件下,由#1语句输出了1、2、3、4语句,之后n=5不再满足条件,递归(递)的过程结束,接下来该递归(归)回去。倒序由#2语句输出4、3、2、1语句,且相同级的地址是相同的,相当于“归”的时候是按照“递”过程的路径原路返回。
递归的原理
递归调用非常类似于一个循环语句。实际上,递归有时可用循环来代替,循环有时也可以用递归来代替。递归函数必须包含能让递归调用停止的语句。通常,递归调用都使用if或其他等价的测试条件在函数形参等于某一特定值时终止递归。
尾递归
最简单的递归形式是把递归调用置于函数的末尾,即正好在return语句之前,这种形式的递归被称为尾递归。例如求阶乘、斐波那契数列等。
递归三要素
1、明确递归终止条件;
2、给出递归终止时的处理办法;
3、提取重复的逻辑,缩小问题规模。
递归的优缺点
优点是递归为某些编程提供了最简单的解决方案。缺点是一些递归算法会快速消耗计算机的内存资源。