栈的应用-递归(Fibonacci)

起源
兔子问题:“假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问一年后共有多少对兔子?”

分析:第一个月兔子没有繁殖能力,所以还是一对;两个月后生下一对兔子,共有两对;三个月后,老兔子生下一对,小兔子还没有繁殖能力,所以一共是三对,以此类推,可以列出下表
在这里插入图片描述
表中1,1,2,3,5,8,13…构成一个序列,这个数列有一个特点就是前两项之和等于后一项
在这里插入图片描述
数学函数定义:

在这里插入图片描述

#include<iostream>
int Fbi(int i);
int main(void)
{
	int i = 4;

	for (i = 1; i <=5; i++)
	{
		printf("%d \t", Fbi(i));
	}

	printf("\n");

	system("pause");

	return 0;
}

int Fbi(int i)
{
	if (i < 2)
	{
		return i == 0 ? 0 : 1;//递归结束的条件
	}

	return Fbi(i - 1) + Fbi(i - 2);
}

//迭代方法实现

int main()
{
   int i;
   int a[40];
   a[0]=1;
   a[1]=1;
   printf("%d and %d",a[0],a[1]);
   for(i=2;i<40;i++)
   { 
      a[i]=a[i-1]+a[i-2];
      printf("%d",a[i]);
   }
   return 0;
}

/*可以把递归看成是在调用一个函数,这个函数和自己本身是一样的,
例如当i=3时,Fbi(2)+Fbi(1)=Fbi(1)+Fbi(0)+Fbi(1)=1+0+1;最终return 2;
当i=4时,Fbi(3)+Fbi(2)=Fbi(2)+Fbi(1)+Fbi(1)+Fbi(0)=Fbi(1)+Fbi(0)+Fbi(1)+Fbi(1)+Fbi(0)=1+0+1+1=3

递归定义:把一个直接调用自己或通过一系列的调用语句间接的调用自己的函数,称为递归函数。

递归当中要注意要有结束递归的条件,否则可能会造成栈的溢出。
*/

迭代使用的是循环结构,而递归使用的是选择结构。递归会让代码的结构简单、清晰,但是大量的递归调用会建立函数的副本,耗费大量的时间和内存。视情况选择实现方法。

递归和栈的关系:递归过程中退回的顺序是它前行顺序的逆序,编译器使用栈来实现递归操作。当然现在很多高级语言已经系统封装了递归,可直接使用。

参考:https://www.cnblogs.com/zkfopen/p/11245857.html

发布了150 篇原创文章 · 获赞 81 · 访问量 6469

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/104061205
今日推荐