Fibonacci Gibonacci 函数实现

本文介绍了Gibonacci数列的概念及其与Fibonacci数列之间的联系,通过代码实现了一个求解Gibonacci数列值的函数。详细解释了如何根据已知的Gibonacci数列前两项和一个特定位置的值来计算目标位置的Gibonacci数列值。同时,提供了一个简洁高效的Fibonacci数列计算函数作为辅助。

Gibonacci数列有关,其实就是一个Fibonacci数列有关,只是是在系数和常数上.

G(0)=1,G(1)=t(t为一个随机数)

给出i,G(i),j 三元组,求G(j),如果不存在,则输出为0

很容易推出(找规律即可) 实际上,设 G2=Temp * F2 ,t = temp-1

G(i)=F(i)*t+F(i-1)  F表示Fibonacci数列

以下是我写的代码,为了方便输出,引用了c++ cout微笑

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define UINT unsigned int


UINT cd_gibonacci(UINT uiNumA, UINT uiResultA, UINT uiNumB);
UINT fibFun(UINT num);
 

int main()
{
    cout<<cd_gibonacci(1,1,2)<<endl;
    cout<<cd_gibonacci(3,5,4)<<endl;
    cout<<cd_gibonacci(3,4,6)<<endl;
    cout<<cd_gibonacci(2,17801,3)<<endl;
    cout<<cd_gibonacci(2,17801,4)<<endl;
    
    
    return 0;
}


UINT cd_gibonacci(UINT uiNumA, UINT uiResultA, UINT uiNumB)
{
    int iTemp = 0;
    UINT uiNFiba = 0;
    UINT uiNFibb = 0;
    UINT uiGibSum = 0;

    uiNFiba = fibFun(uiNumA);
    uiNFibb = fibFun(uiNumA-1);
    if(uiNFiba == uiResultA)                //如果此时输入的 就是 fib数列,则直接返回fibFun即可
    {
        uiGibSum = fibFun(uiNumB);
    }
    else
    {
        iTemp =(uiResultA-uiNFiba)/uiNFibb;           
        if (((uiResultA-uiNFiba)%uiNFibb == 0) && iTemp >=1)       //用正向逻辑,减少虚拟分支    
        {
            uiNFiba = fibFun(uiNumB);
            uiNFibb = fibFun(uiNumB-1);    
            uiGibSum = uiNFiba+iTemp*uiNFibb;    
        }
    }
    return uiGibSum;              //少用return
}


UINT fibFun(UINT num)             //之所以没有申请数组,是为了让内存节省空间
{
    UINT uiFib0 = 1;
    UINT uiFib1 = 1;
    UINT uiFibSum = 0;

    if((num == 0) || (num ==1))     //若是 0 和 1 则fib数列第一个和第二个 都为1
    {
        return 1;
    }
    
    num = num -1;                 //这边注意要减1
    while(num)
    {
        uiFibSum = uiFib0 + uiFib1;
        uiFib0 = uiFib1;
        uiFib1 = uiFibSum;        
        num--;
    }
    return uiFibSum;
}


结果如下


当然 fib函数也可以写成下面递归的形式

UINT fibFun(UINT num)             
{
    if(num == 0 !! num==1)
    {
        return 1;
    }
    return fibFun(num-1)+fibFun(num-2);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值