从斐波那契数列了解递归

斐波那契数列:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
如果设F(n)为该数列的第n项(n>=3),那么这句话可以写成如下形式:
F(n)=F(n-1)+F(n-2)

问题がある:给定一个整数n,如何去求F(n)?

由上面的式子可知:当n>=3的时候该式子成立,那当n=1或n=2的时候呢?

由上面的数列可知:F(1) = 1,F(2) = 2。这就是临界条件。
假设n=5,那么该过程可以这么表达:

F(5) = F(4) + F(3) - - - <1>

先进行F(5)中F(4)的计算(能理解吗?)

F(4) = F(3) + F(2) - - - <2>

先进行F(4)中F(3)的计算(同理)

F(3) = F(2) + F(1)

由上可得F(3) = 2,返回到<2>中:

F(4) = 2 + F(2)

同理可得F(4) = 3,返回到<1>中:

F(5) = 3 +F(3)

然后计算F(3)的计算

F(3) = F(2) + F(1)

由上可得F(3) = 2

最后求得F(5) = 5

由于F(1)和F(2)是这个递归的边界,所以在到达边界之前递归会一直进行。
只有当遇到边界的时候,得到边界的值后,才会进行回溯

总结

递归的过程就是不断地进行递归及到达边界后回溯的过程

递归还有一个经典的例题:爬楼梯
在这里插入图片描述

问题:小明爬楼梯,一次可以上一个或两个台阶,请问上到第N个台阶一共有几种走法?

图中一共有6个台阶,根据小明的走法,他会从那里走到第六个台阶呢?
不错,他只可能从第五个或者第四个上来。重复刚才的问题,你会发现问题会变成:小明走到第二个台阶有几种方法?显然有两种方法:一步两个,一步一个,两次上去。
小明走到第一个台阶显然只有一种方法,那么边界就显而易见了:

F(1) = 1 ,F(2) = 2 且F(n)=F(n-1)+F(n-2) (n>=3)

代码:

#include <cstdio>
int digui(int c)//层数
{
	//这两个就是边界条件
	if(c == 1)return 1;
	if(c == 2)return 2;
	//如果不到边界就接着向下递归
	return digui(c-1) + digui(c-2);//先进行c-1层的计算
}
int main()
{
	int i;
	scanf("%d",&n);
	printf("%d",digui(n));
	return 0;
}

顺便说一下:int函数会返回一个整型数字,double函数会返回一个double值,void函数不返回值这里就返回了到达某一层的方法数量

总结:

递归有两个注意事项边界如何向下递归(需要根据具体进行分析)

在这里留一个问题:

根据我分析斐波那契数列的过程来看,递归函数有什么缺点?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章