【C/C++练习题】斐波那契数列

举报
王建峰 发表于 2021/11/19 01:40:50 2021/11/19
【摘要】 《剑指Offer》面试题10   1 问题 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。   2 分析 对于斐波那契数列问题,至少有递归和循环两种算法。下面就解法的角度,分析一下两种方法的优劣 递归:优点是思路简单,代码也比较直观;缺点是效率低,调用栈区空间会对时间和空间造成...

《剑指Offer》面试题10

 

1 问题

题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。

 

2 分析

对于斐波那契数列问题,至少有递归和循环两种算法。下面就解法的角度,分析一下两种方法的优劣

递归:优点是思路简单,代码也比较直观;缺点是效率低,调用栈区空间会对时间和空间造成消耗(严重的话会造成栈溢出),另外在递归的过程中还可能有很多计算是重复的。

循环:提高的算法在时间上的效率。相对于递归实现,是比较实用的方法。

 

3 代码


  
  1. #include "iostream"
  2. using namespace std;
  3. //方式一:使用递归实现
  4. //输入:n
  5. //返回:结果值
  6. long long Fibonacci_Solution1(unsigned int n)
  7. {
  8. if (n == 0)
  9. {
  10. return 0;
  11. }
  12. if (n == 1)
  13. {
  14. return 1;
  15. }
  16. return Fibonacci_Solution1(n-1) + Fibonacci_Solution1(n-2);
  17. }
  18. //方式二:使用循环实现
  19. //输入:n
  20. //返回:结果值
  21. long long Fibonacci_Solution2(unsigned n)
  22. {
  23. int res[] = {0, 1};
  24. if (n <= 1)
  25. {
  26. return res[n];
  27. }
  28. long long FibNMinusOne = 0;
  29. long long FibNMinusTwo = 1;
  30. long long FibN = 0;
  31. for (int i = 2; i <= n; i++)
  32. {
  33. FibN = FibNMinusOne + FibNMinusTwo;
  34. FibNMinusOne = FibNMinusTwo;
  35. FibNMinusTwo = FibN;
  36. }
  37. return FibN;
  38. }
  39. //测试1
  40. void test01()
  41. {
  42. long long res = Fibonacci_Solution1(100);
  43. cout << "res:" << res << endl;
  44. }
  45. //测试2
  46. void test02()
  47. {
  48. long long res = Fibonacci_Solution2(100);
  49. cout << "res:" << res << endl;
  50. }
  51. int main(int argc, char const *argv[])
  52. {
  53. if (argc >= 2)
  54. {
  55. if ('1' == argv[1][0]) test01();
  56. if ('2' == argv[1][0]) test02();
  57. }
  58. else
  59. {
  60. cout << "please input an arg" << endl;
  61. }
  62. return 0;
  63. }

 

4 运行

使用递归方法,我等待了很长时间,也没等到一个结果(捂脸)。

 

5 同类型题

青蛙跳台阶问题

一只青蛙可以一次跳1层台阶,也可以一次跳2层台阶,问青蛙跳上n层台阶有多少种跳法?

  • 当n等于0的时候,0层台阶,f(0)=0;
  • 当n等于1的时候,1层台阶,也就1种跳法,f(1)=1;
  • 当n等于2的时候,2层台阶,可以一次跳两层,也可以一层一层跳,两种跳法,f(2)=2;
  • 当n层台阶时,如果第一次跳一层,那么剩下的n-1台阶就有f(n-1)种跳法;如果第一次跳两次层,剩下n-2的台阶有f(n-2)种跳法。显然,这是斐波那契数列的一个应用。

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/96854187

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。