递归
总的来说就是自己调自己。一个过程或者函数在其定义或说明中有直接或间接调用自身的方法,它通常把一个大型复杂问题转化成一个与原问题相似的规模较小的问题来求解。
其优点是大大地减少了程序的代码量。缺点是需要多次调用函数,需要不断在栈上开辟空间(形成栈帧结构),被调函数调用结束后返回一个数到上个被调函数,该被调函数空间被释放。在这个过程中,需要时间的耗费。递归次数越多,所需花费时间也越多。
递归的两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归不再继续。即递归出口。
2.每次递归调用后越来越接近限制条件。
递归示意图:(以用递归求字符串长度为例)
迭代法求斐波那契数:
斐波那契数有个递推关系:
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2),其中n>=2
我们可知递归的出口是 n<=2
源代码如下:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0, p = 0;
scanf("%d", &n);
p = fib(n);
printf("%d\n", p);
system("pause");
return 0;
}
当n小于等于2时,斐波那契数列前两项都是1,故返回1;
当n大于2,即n>=3时,这个斐波那契数n等于前两个数的和。
引用一个文件夹例子,如下图所示: