递归——斐波那契数列多种求解方法

刺骨的言语ヽ痛彻心扉 2022-12-23 03:23 246阅读 0赞

斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:
0、1、1、2、3、5、8、13、21、34、……
在数学上,斐波那契数列以如下被以递推的方法定义:
F(0)=0,
F(1)=1,
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

用循环法:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. //构建斐波那契数列
  3. //{0,1,1,2,3,5,8,13,...}即:F(n=F(n-1)+F(n-2)
  4. //循环法
  5. #include<stdio.h>
  6. int main()
  7. {
  8. int n = 0;
  9. int a = 0;
  10. int c = 0;
  11. printf("请输入你要输出第几个斐波那契数(大于0):\n");
  12. scanf("%d", &n);
  13. if (n < 0)
  14. {
  15. printf("请输入一个大于1的数\n");
  16. }
  17. else if (n==1)
  18. {
  19. a = 0;
  20. printf("斐波那契数为:%d\n", a);
  21. }
  22. else if (n == 2)
  23. {
  24. a = 1;
  25. printf("斐波那契数为:%d\n", a);
  26. }
  27. else
  28. {
  29. int a = 0;
  30. int b = 1;
  31. while (n > 2)
  32. {
  33. c = a + b;
  34. a = b;
  35. b = c;
  36. n--;
  37. }
  38. }
  39. printf("斐波那契数为:%d\n", c);
  40. return 0;
  41. }

在这里插入图片描述

用函数的方法:

非递归方式

  1. //非递归的方法求斐波那契数列
  2. #include<stdio.h>
  3. int Fib(int x)
  4. {
  5. if (x == 1)//当x等于1时候,直接返回0
  6. return 0;
  7. else if (x == 2)//当x等于2时候,直接返回1
  8. return 1;
  9. else
  10. {
  11. int first = 0;//定义第1个斐波那契数为0
  12. int second = 1;//定义第2个斐波那契数为0
  13. int ret = 0;//定义一个整形接收值
  14. while (x>2)//当x大于2的时候进入循环
  15. {
  16. ret = first + second;
  17. first= second;
  18. second = ret;
  19. x--;
  20. }
  21. return ret;//返回ret的值
  22. }
  23. }
  24. int main()
  25. {
  26. int n = 0;
  27. printf("请输入你要输出第几个斐波那契数(大于0):\n");
  28. scanf("%d", &n);
  29. if (n > 0)
  30. {
  31. printf("第%d个斐波那契数为:%d\n",n, Fib(n));
  32. }
  33. else
  34. {
  35. printf("请输入一个大于1的数\n");
  36. }
  37. return 0;
  38. }

在这里插入图片描述

递归方式

  1. //递归的方法求斐波那契数列
  2. #include<stdio.h>
  3. int Fib(int x)
  4. {
  5. if (x == 1)
  6. {
  7. return 0;//第一个斐波那契数为0
  8. }
  9. else if (x == 2)
  10. {
  11. return 1;//第二个斐波那契数为1
  12. }
  13. else
  14. {
  15. return Fib(x - 1) + Fib(x - 2);//从第三个数开始就回去找Fib(2)和Fib(1)
  16. //不断回去找直到找到为止
  17. }
  18. }
  19. int main()
  20. {
  21. int n = 0;
  22. printf("请输入你要输出第几个斐波那契数(大于0):\n");
  23. scanf("%d", &n);
  24. if (n > 0)
  25. {
  26. printf("第%d个斐波那契数为:%d\n",n, Fib(n));
  27. }
  28. else
  29. {
  30. printf("请输入一个大于1的数\n");
  31. }
  32. return 0;
  33. }

在这里插入图片描述

求斐波那契数列前几项的和

代码1:

  1. #include<stdio.h>
  2. int FibSum(int x)
  3. {
  4. if (x == 1)//前1项的和为0
  5. {
  6. return 0;
  7. }
  8. else if (x == 2)//前2项的和为1
  9. {
  10. return 1;
  11. }
  12. else
  13. {
  14. int first = 0;
  15. int second = 1;
  16. int sum = 1;//从第3项开始计算和,没有加前两项的和,所以sum初始化为1
  17. int ret = 0;
  18. while (x > 2)
  19. {
  20. ret = first + second;
  21. first = second;
  22. second = ret;
  23. sum += ret;//每次求出的斐波那契数加在sum上
  24. x--;
  25. }
  26. return sum;
  27. }
  28. }
  29. int main()
  30. {
  31. int n = 0;
  32. printf("请输入你要求前几项的和:\n");
  33. scanf("%d", &n);
  34. if (n > 0)
  35. {
  36. printf("前%d项斐波那契数的和为:%d\n",n,FibSum(n));
  37. }
  38. else
  39. {
  40. printf("请输入一个大于0的数\n");
  41. }
  42. return 0;
  43. }

在这里插入图片描述
代码2:

  1. //求菲波那切数列前几项的和
  2. //递归方法
  3. #include<stdio.h>
  4. int Fib(int x)
  5. {
  6. if (x == 1)
  7. {
  8. return 0;
  9. }
  10. else if (x == 2)
  11. {
  12. return 1;
  13. }
  14. else
  15. {
  16. return Fib(x-1) + Fib(x - 2);
  17. }
  18. }
  19. int main()
  20. {
  21. int n = 0;
  22. printf("请输入你要求前几项的和:\n");
  23. scanf("%d", &n);
  24. if (n > 0)
  25. {
  26. int sum = 0;
  27. for (int i = 1; i <= n; i++)//利用for循环求和
  28. {
  29. sum += Fib(i);
  30. }
  31. printf("前%d项斐波那契数的和为:%d\n", n,sum );
  32. }
  33. else
  34. {
  35. printf("请输入一个大于0的数\n");
  36. }
  37. return 0;
  38. }

在这里插入图片描述
总结:
如果所求的斐波那契数或前n项和数字比较小的话,可能使用递归和不使用区别不大,但是当数字特别大的时候,使用递归的话,速度会非常慢,因为做了很多的重复计算(因为要不停的回去找前面的数)

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法实现数列

    假定兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子? 这就是著名的斐波那契数列,也称作兔子数列。 >