经典递归算法之Fibonacci序列

刚开始写算法博客,就从比较简单的算法实现开始吧

斐波那契(Fibonacci)序列

首先先简单说一下Fibonacci序列,Fibonacci序列的第一个和第二个数都是1,后面每一位数都是它的前两个数的和 eg:1,1,2,3,5,8,13,21,34,…

然后是几种实现算法,
那么我就用c++来实现下 (1)我觉得需要注意的是如果要实现一种算法,最好是让它封装在一个方法中,这样代码清晰而且代码可重用性就大大的提高了,所以我这里不再赘述直接在主方法中实现算法的方法,因为不想让这种方法影响思维。 (2)最先想到的递归算法肯定是循环


#include<iostream>
using namespace std;
long Fibonacci(long n) {//n是所需Fibonacci序列的第n个数
 int first = 1;
 int second = 1;
 int next = 0;
 if (n <= 2) 
  return 1;
 else {
  for (int i = 3; i <= n; i++) {
   next = first + second;
   first = second;
   second = next;
  }
  return next;
 }
}
int main() {
 long n;
 cout << "Enter the length of the Fibonacci sequence:";
 cin >> n;
 cout<<"The "<<n<<"th Fibonacci number is "<< Fibonacci(n)<<endl;
 return 0;
}

这种算法的时间复杂度是O(n),空间复杂度是O(1)

(3)下面用最先想到的递归来实现

#include<iostream>
using namespace std;
long Fibonacci(long n) {//n是所需Fibonacci序列的第n个数
 int first = 1;
 int second = 1;
 if (n < 3) {
  return 1;
 }
 else
  return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main() {
 long n;
 cout << "Enter the length of the Fibonacci sequence:";
 cin >> n;
 cout<<"The "<<n<<"th Fibonacci number is "<< Fibonacci(n)<<endl;
 return 0;
}

这种算法的时间复杂度是O(2^n),空间复杂度是O(n)

(4)这次用尾递归实现

#include<iostream>
using namespace std;
//f1是第n-1个Feibonacii数,f2是第n-2个Fibonacci数,n是所需Fibonacci序列的第n个数
long Fibonacci(long f1,long f2,long n) {
 if (n < 3)
  return f1;
 else
  return Fibonacci(f1 + f2 , f1 , n - 1);
}
int main() {
 long n;
 cout << "Enter the length of the Fibonacci sequence:";
 cin >> n;
 cout<<"The "<<n<<"th Fibonacci number is "<< Fibonacci(1,1,n)<<endl;
 return 0;
}

这种算法的时间复杂度是O(n),空间复杂度是O(1)

    原文作者:递归算法
    原文地址: https://blog.csdn.net/fancy_track/article/details/79779363
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞