【演算法】Fibonacci(斐波那契數列)相關問題

GeekDragon發表於2018-10-24

一、列出Fibonacci數列的前N個數

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            cal(20);
            cal2(20);
            //執行結果相同
        }
        /*需求:列出Fibonacci數列的前N個數*/
        //方案一:迭代N次,一次計算一項
        public static void cal(int N)
        {
            int f1 = 1;
            int f2 = 1;
            int f = 0;
            for (int i = 1; i <= N; i++)
            {
                if (i == 1)
                {
                    Console.Write(f1);
                    Console.Write(" ");
                }
                else if (i == 2)
                {
                    Console.Write(f2);
                }
                else
                {
                    f = f1 + f2;
                    f2 = f1;
                    f1 = f;
                    Console.Write(" ");
                    Console.Write(f);

                }
            }
        }
        //方案二:迭代N/2次,一次計算兩項
        public static void cal2(int N)
        {
            int f1 = 1;
            int f2 = 1;
            for (int i = 1; i <= N / 2; i++)
            {
                Console.Write(" ");
                Console.Write(f1);
                Console.Write(" ");
                Console.Write(f2);

                f1 = f1 + f2;
                f2 = f2 + f1;
            }
        }

二、求出Fibonacci數列第N個數字(遞迴)

namespace Fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            string N = Console.ReadLine();
            int integer = Convert.ToInt32(N);
            Console.WriteLine("{0}",F(integer));

        }
        /*需求:求出Fibonacci數列第N個數字*/

        //遞迴
        public static int F(int N)
        {
            if (N == 1)
                return 1;
            if (N == 2)
                return 1;
            else
                return F(N - 1) + F(N - 2);
        }
    }
}

三、古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

問題分析:其兔子數目依舊是按1,1,2,3,5…的順序進行排列。其本質仍為斐波那契數列。

解決:按照一中的方案二進行即可。

namespace Fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            //與方案二相同
            string N = Console.ReadLine();
            int integer = Convert.ToInt32(N);
            int f1 = 1;
            int f2 = 1;
            for (int i = 1; i <= integer; i++)
            {
                Console.Write("{0} {1}",f1,f2);
                Console.Write(" ");
                if (i%2==0)
                    Console.WriteLine("
");
                f1 = f1 + f2;
                f2 = f2 + f1;
            }
        }
        
    }
}

若後續有相關問題,餘則繼續補充。

願諸位朋友及時指正!

相關文章