C#,广义斐波那契数(Generalised Fibonacci Numbers)的算法

广义斐波那契序列(generalized Fibonacci sequence)是斐波那契数的推广。由递推关系F₁=F₂=...=Fm-1=0,Fₘ=1,Fm+n=Fₙ+Fn+1+...+Fn+m+1,n≥1所产生的序列,称为m级广义斐波那契序列。

计算结果:

源代码:

1 文本格式

using System;

namespace Legalsoft.Truffer.Algorithm

{

/// <summary>

/// 广义斐波那契数

/// Generalised Fibonacci Numbers

/// </summary>

public static partial class Number_Sequence

{

/// <summary>

/// 广义斐波那契数的算法

/// </summary>

/// <param name="N"></param>

/// <param name="a"></param>

/// <param name="b"></param>

/// <param name="m"></param>

/// <param name="n"></param>

/// <returns></returns>

public static int Generalized_Fibonacci_Number(int N, int a, int b, int m, int n)

{

int[,] F = { { m, 1 }, { n, 0 } };

if (N == 0)

{

return a;

}

if (N == 1)

{

return b;

}

if (N == 2)

{

return m * b + n * a;

}

int[,] initial = { { m * b + n * a, b }, { b, a } };

GFN_Power(ref F, N - 2, m, n);

Fib_Multiply(ref initial, F);

return F[0, 0];

}

/// <summary>

/// 2x2矩阵乘法

/// </summary>

/// <param name="F"></param>

/// <param name="M"></param>

static void Fib_Multiply(ref int[,] F, int[,] M)

{

int x = F[0, 0] * M[0, 0] + F[0, 1] * M[1, 0];

int y = F[0, 0] * M[0, 1] + F[0, 1] * M[1, 1];

int z = F[1, 0] * M[0, 0] + F[1, 1] * M[1, 0];

int w = F[1, 0] * M[0, 1] + F[1, 1] * M[1, 1];

F[0, 0] = x;

F[0, 1] = y;

F[1, 0] = z;

F[1, 1] = w;

}

private static void GFN_Power(ref int[,] F, int N, int m, int n)

{

int[,] M = { { m, 1 }, { n, 0 } };

for (int i = 1; i <= N; i++)

{

Fib_Multiply(ref F, M);

}

}

}

}


POWER BY TRUFFER.CN

2 代码格式

cs 复制代码
using System;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// 广义斐波那契数
    /// Generalised Fibonacci Numbers
    /// </summary>
    public static partial class Number_Sequence
    {
        /// <summary>
        /// 广义斐波那契数的算法
        /// </summary>
        /// <param name="N"></param>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="m"></param>
        /// <param name="n"></param>
        /// <returns></returns>
        public static int Generalized_Fibonacci_Number(int N, int a, int b, int m, int n)
        {
            int[,] F = { { m, 1 }, { n, 0 } };
            if (N == 0)
            {
                return a;
            }
            if (N == 1)
            {
                return b;
            }
            if (N == 2)
            {
                return m * b + n * a;
            }
            int[,] initial = { { m * b + n * a, b }, { b, a } };
            GFN_Power(ref F, N - 2, m, n);
            Fib_Multiply(ref initial, F);
            return F[0, 0];
        }

        /// <summary>
        /// 2x2矩阵乘法
        /// </summary>
        /// <param name="F"></param>
        /// <param name="M"></param>
        static void Fib_Multiply(ref int[,] F, int[,] M)
        {
            int x = F[0, 0] * M[0, 0] + F[0, 1] * M[1, 0];
            int y = F[0, 0] * M[0, 1] + F[0, 1] * M[1, 1];
            int z = F[1, 0] * M[0, 0] + F[1, 1] * M[1, 0];
            int w = F[1, 0] * M[0, 1] + F[1, 1] * M[1, 1];

            F[0, 0] = x;
            F[0, 1] = y;
            F[1, 0] = z;
            F[1, 1] = w;
        }

        private static void GFN_Power(ref int[,] F, int N, int m, int n)
        {
            int[,] M = { { m, 1 }, { n, 0 } };
            for (int i = 1; i <= N; i++)
            {
                Fib_Multiply(ref F, M);
            }
        }
    }
}
相关推荐
和光同尘@15 分钟前
74. 搜索二维矩阵(LeetCode 热题 100)
数据结构·c++·线性代数·算法·leetcode·职场和发展·矩阵
一去不复返的通信er16 分钟前
SVD预编码
算法·信息与通信·预编码算法·通信原理
code bean40 分钟前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
柠石榴1 小时前
【练习】【二分】力扣热题100 34. 在排序数组中查找元素的第一个和最后一个位置
c++·算法·leetcode·二分
Tisfy1 小时前
LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)
算法·leetcode·深度优先·dfs·题解·记忆化搜索·深度优先搜索
Trouvaille ~1 小时前
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
数据结构·c++·算法·蓝桥杯·计算机科学·平衡二叉树·avl
陈浩源同学2 小时前
学习 TypeScript 栈和队列数据结构
前端·算法
夏末秋也凉3 小时前
力扣-回溯-491 非递减子序列
数据结构·算法·leetcode
penguin_bark3 小时前
三、动规_子数组系列
算法·leetcode
kyle~3 小时前
thread---基本使用和常见错误
开发语言·c++·算法