1. 程式人生 > 其它 >學習筆記:遞迴&記憶化搜尋優化斐波那契數列

學習筆記:遞迴&記憶化搜尋優化斐波那契數列

技術標籤:C#&unity 遊戲開發自學遞迴演算法

首先我們知道,斐波那契數列是前兩項為1,第三項之後是前兩項數字的和的數列
1,1,2,3,5,8,13,21…
程式碼寫了一個方法fib,引數a是數列最後一個數字的索引,引數num是計數器,看看執行後方法共執行了幾次。
返回值是數列最後一個數字。

namespace 斐波那契數列20201224
{
    class Program
    {      
        static void Main(string[] args)
        {           
            int num = 0;
            int a =
fib(5, ref num); Console.WriteLine(a); Console.WriteLine(num); Console.ReadLine(); } public static int fib(int a,ref int num) { num++; if (a == 0 || a == 1) { return 1; }
else { return fib(a - 1, ref num) + fib(a - 2, ref num); } } } }

輸出結果是:
在這裡插入圖片描述
即,斐波那契數列索引是5(即第六個數字)是8,方法執行了15次。
這個時候我們發現方法執行的次數太多了,比如a[2] = a[1]+a[0],計算了一次,到計算a[3]=a[2]+a[1]的時候,a[2]的值又會重新計算一次,計算過的值被重複計算,產生了資源的浪費。

這個時候引入記憶化搜尋這個概念。
即首先建立一個數組fibo[],負責存放計算過的值,即第一次計算a[2] = a[1]+a[0],將a[2]直接存入fibo[2]

在下次計算a[2]的時候做一個判斷,如果fibo[2]有值,則直接將fibo[2]的值給a[2],避免重複計算。

namespace 斐波那契數列20201224
{
    class Program
    {
        static int[] fibo = new int[10000];
        static void Main(string[] args)
        {           
            int num = 0;
            int a =fib(5, ref num);
            Console.WriteLine(a);
            Console.WriteLine(num);
            Console.ReadLine();
        }
        public static int fib(int a,ref int num) 
        {           
            num++;
            if (a == 0 || a == 1) 
            {
                return 1;
            }
            if (fibo[a] != 0)
            {
                return fibo[a];
            }
            else 
            {
                fibo[a] = fib(a - 1, ref num) + fib(a - 2, ref num);
                return fibo[a];
            }
        }
    }
}

在這裡插入圖片描述
這一回方法只進入了9次,提高了效率。