zoukankan      html  css  js  c++  java
  • 输出第 n 个斐波纳契数(Fibonacci)

    方法一、简单递归

    这个就不说了,小n怡情,大n伤身啊……当n=40的时候,就明显感觉到卡了,不是一般的慢。

     1 //输出第n个 Fibonacci 数 
     2 #include <iostream>
     3 using namespace std;
     4 
     5 long long Fibonacci(int n)
     6 {    
     7     if(n<=2) return 1;    
     8     else return Fibonacci(n-1) + Fibonacci(n-2);
     9 }
    10 
    11 
    12 int main()
    13 {
    14     int n;
    15     while(cin>>n, n) 
    16         cout<<Fibonacci(n)<<endl;
    17         
    18     return 0;
    19 }

    方案二、动态规划

     1 //输出第n个 Fibonacci 数 
     2 #include <iostream>
     3 #include <cstring>
     4 #define MAXN 300
     5 using namespace std;
     6 
     7 long long F[MAXN];
     8 int i;
     9 long long Fibonacci(int n)
    10 {    
    11     i++;
    12     F[0]=1;
    13     F[1]=1;
    14     if(n<=2) return 1;    
    15     else
    16     {
    17         if(F[n]==0)    // !!!!!!!!!!
    18             F[n]=Fibonacci(n-1) + Fibonacci(n-2);
    19         return F[n];
    20     }
    21 }
    22 
    23 
    24 int main()
    25 {
    26     int n;
    27     while(cin>>n, n) 
    28     {
    29         i=0;
    30         memset(F,0,sizeof(F));
    31         cout<<Fibonacci(n)<<" ";
    32         cout<<"调用"<<i<<""<<endl;
    33         
    34     }
    35     return 0;
    36 }

    【以上程序可以优化:既然只要求输出第n个斐波纳契数f(n),则只需用两个变量记录f(n-1)和f(n-2),不用开数组将整个1到n的斐波纳契数列都记录下来。】

    最开始忘了 if(F[n]==0) 这个判断(17行),导致了很多次的重复计算——和递归算法一样多的次数。

    以下是程序运行截图,上图为正确程序,下图为漏掉了 if(F[n]==0) 这个判断的错误程序。可以看出运行时间上的巨大差距:

    当输入n=100时,错误的程序很长很长一段时间内都还没计算出来。

    方法三、for循环 + 数组

    速度也非常快。

     1 //输出第n个 Fibonacci 数 
     2 #include <iostream>
     3 #include <cstring>
     4 #define MAXN 300
     5 using namespace std;
     6 
     7 long long F[MAXN];
     8 long long Fibonacci(int n)
     9 {    
    10     F[0]=1;
    11     F[1]=1;
    12     if(n<=2) return 1;    
    13     else
    14     {
    15         for(int i=2; i<n; ++i)
    16             F[i] = F[i-1] + F[i-2];
    17         return F[n-1];
    18     }
    19 }
    20 
    21 
    22 int main()
    23 {
    24     int n;
    25     while(cin>>n, n) 
    26     {
    27         memset(F,0,sizeof(F));
    28         cout<<Fibonacci(n)<<endl;
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    [MacOS]Sublime text3 安装(一)
    [RHEL8]开启BBR
    PAT Advanced 1136 A Delayed Palindrome (20分)
    PAT Advanced 1144 The Missing Number (20分)
    PAT Advanced 1041 Be Unique (20分)
    PAT Advanced 1025 PAT Ranking (25分)
    PAT Advanced 1022 Digital Library (30分)
    PAT Advanced 1019 General Palindromic Number (20分)
    PAT Advanced 1011 World Cup Betting (20分)
    PAT Advanced 1102 Invert a Binary Tree (25分)
  • 原文地址:https://www.cnblogs.com/atong/p/3309625.html
Copyright © 2011-2022 走看看