当前位置:   article > 正文

斐波那契数列【C语言实现】_斐波那契数列c语言

斐波那契数列c语言

1. 定义:

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、55、...... 这个数列从第3项开始,每一项都等于前两项之和。

2. 求第n个斐波那契数的方法:

(1)递归

  1. #include<stdio.h>
  2. int Fib(int n)
  3. {
  4. if (n <= 2)
  5. {
  6. return 1;
  7. }
  8. else
  9. {
  10. return Fib(n - 1) + Fib(n - 2);
  11. }
  12. }
  13. int main()
  14. {
  15. int n = 0;
  16. printf("input n: ");
  17. scanf("%d", &n);
  18. printf("%d\n",Fib(n));
  19. return 0;
  20. }

我们输入50,看一下第50个斐波那契数是什么

可以看见,光标一直在闪,说明程序是一直在执行的状态,但是没有输出结果,这是为什么呢?

 可见,重复计算的数有很多,是个不小的工程量,我们可以计算一下某个斐波那契数被重复计算的次数

统计一下计算第40个斐波那契数时第3个斐波那契数被重复计算的次数(代码如下):

  1. //递归法
  2. #include<stdio.h>
  3. int count = 0;//全局变量
  4. int Fib(int n)
  5. {
  6. //统计的是 第3个斐波那契数被重复计算的次数
  7. if (3 == n)
  8. {
  9. count++;
  10. }
  11. if (n <= 2)
  12. {
  13. return 1;
  14. }
  15. else
  16. {
  17. return Fib(n - 1) + Fib(n - 2);
  18. }
  19. }
  20. int main()
  21. {
  22. int n = 0;
  23. printf("input n: ");
  24. scanf("%d", &n);
  25. printf("%d\n",Fib(n));
  26. printf("count= %d\n", count);
  27. return 0;
  28. }

 由此可见,计算机的计算量非常大,时间复杂度和空间复杂度都极高,很容易造成栈溢出和超时。所以这里使用递归显然不是一个明智的选择。

(2)迭代

  1. //迭代法
  2. #include<stdio.h>
  3. int Fib(int n)
  4. {
  5. int a = 1;
  6. int b = 1;
  7. int c = 1;
  8. while (n>2)
  9. {
  10. c = a + b;
  11. a = b;
  12. b = c;
  13. n--;
  14. }
  15. return c;
  16. }
  17. int main()
  18. {
  19. int n = 0;
  20. printf("input n: ");
  21. scanf("%d", &n);
  22. printf("%d\n",Fib(n));
  23. return 0;
  24. }

循环迭代方法的效率大大高于递归,只是相比于递归代码可读性稍微差一些。

3. 提示:

(1)许多问题是以递归的形式进行解释的,这只是因为它们比非递归的形式更为清晰。

(2)但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差一些。

(3)当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时的开销。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/434061
推荐阅读
相关标签
  

闽ICP备14008679号