K阶斐波那契数列

K阶斐波那契数列
定义:第k和k+1项为1,前k - 1项为0,从k项之后每一项都是前k项的和
例如:k = 3:,0 0 1 1 2 4 7 13
13 = 2 * 7 - 1
7 = 2 * 4 - 1
4 = 2 * 2 - 0
后一项等于 前一项的2倍 减去 前k+1项。这就是后面递归的原理
C语言实现:
能用递归和3种循环都实现是很不错的

#include <stdio.h>
#include <stdlib.h>
#define N 9//要计算的项
#define K 3//阶次

int Fib_1(int k, int m)
{//K阶斐波那契数列的前K-1项均为0,第k项为1,以后的每一项都是前K项的和
    //本算法计算k阶斐波那契数列的第k项-递归实现
    if (m < k)
        return 0;
    else if ((m == k) || (m == k + 1))
        return 1;
    else
        return 2 * Fib_1(k, m - 1) - Fib_1(k, m - k - 1);//乘2了
}


int Fib_2(int k, int m)
{//K阶斐波那契数列的前K-1项均为0,第k项为1,以后的每一项都是前K项的和
    //本算法计算k阶斐波那契数列的第k项-循环实现
    int i;
    int F[N];
    for (i = 0; i < k + 1; i++)
    {
        if (i < k - 1)
        {
            F[i] = 0;//前k - 1项为0
        }
        else
        {
            F[i] = 1;//k和k+1项为1
        } 
        //printf("F[%d] = %d\n", i, F[i]);
    }  
    for (; i < N; i++)
    {
        F[i] = 2 * F[i - 1] - F[i - k - 1];//计算的原理,大家一定要懂计算后一项的算法
        //printf("F[%d] = %d\n", i, F[i]);
    }
    return F[m - 1];//数组的下标要减去1,第9项 = F[8]
}

int main(void)
{
    //自己测试下吧
    int m = Fib_2(K, N);
    printf("m = %d\n", m);  
    system("pause");
    return 0;
}

你可能感兴趣的:(算法,C语言,k阶斐波那契数列)