前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k 阶斐波那契序列的第 m 项值的函数算法—C语言

k 阶斐波那契序列的第 m 项值的函数算法—C语言

作者头像
WindCoder
发布2018-09-20 11:40:31
1.1K0
发布2018-09-20 11:40:31
举报
文章被收录于专栏:WindCoder
代码语言:javascript
复制
/***************************************************
作业要求:
		求 k 阶斐波那契序列的第 m 项值的函数算法

完成日期:
		2013年9月3日
***************************************************/
#include <stdio.h>

// 函数原型
int fibnocci_1(int m, int k);
int fibnocci_2(int m, int k);
int fibnocci_3(int m, int k);

// main函数
int main(void)
{
	// 求3阶fibnocci数列第8项的值
	// 0 0 1 1 2 4 7 13 24 ……
	printf("%dn", fibnocci_1(8, 3));
	printf("%dn", fibnocci_2(8, 3));
	printf("%dn", fibnocci_3(8, 3));

	return 0;
}

/****************************************************
函数功能:
		求k阶fibnocci数列的第m项值
算法思想:
		(1) 根据m和k的值,先返回特殊情况下的值;
		(2) 首先初始化前k项值;
		(3) 按照公式求第k+1项至第m项的值。
函数参数:
		int		m		待求fibnocci数列项数
		int		k		fibnocci数列的阶数
返回值:
		返回k阶fibnocci数列第m项的值
时间复杂度:
		O(m * k):双重循环(外层为m-k,内层为k)
空间复杂度:
		O(m):	开辟的辅助存储空间总共有m+3个(f、i、j、result)
*****************************************************/
int fibnocci_1(int m, int k)
{
	int i, j, result;
	int *f;				// 辅助数组空间
	// 特殊情况
	if (m < k-1)
	{
		return 0;
	}
	else if (m == k-1 || m == k)
	{
		return 1;
	}

	// 一般情况

	// 动态内存分配辅助空间
	f = (int *) malloc(sizeof(int) * (m+1));

	// 初始化前k项的值
	for (i = 0; i < k-1; ++i)
	{
		f[i] = 0;
	}
	f[k-1] = f[k] = 1;

	// 求第m项值
	for (i = k+1; i <= m; ++i)
	{
		f[i] = 0;
		for (j = 1; j <= k; ++j)
		{
			f[i] += f[i - j];
		}
	}
	result = f[m];

	// 释放辅助空间
	free(f);

	return result;
}

/****************************************************
函数功能:
		求k阶fibnocci数列的第m项值
算法思想:
		(1) 根据m和k的值,先返回特殊情况下的值;
		(2) 首先初始化前k项值;
		(3) 按照公式求第k+1项至第m项的值(借助数学运算简化求解)。
函数参数:
		int		m		待求fibnocci数列项数
		int		k		fibnocci数列的阶数
返回值:
		返回k阶fibnocci数列第m项的值
时间复杂度:
		O(m):	计算第m项时,借助数学公式取消内层循环
空间复杂度:
		O(m):	开辟的辅助存储空间总共有m+3个(f、i、j、result)
*****************************************************/
int fibnocci_2(int m, int k)
{
	int i, j, result;
	int *f;				// 辅助数组空间
	// 特殊情况
	if (m < k-1)
	{
		return 0;
	}
	else if (m == k-1 || m == k)
	{
		return 1;
	}

	// 一般情况

	// 动态内存分配辅助空间
	f = (int *) malloc(sizeof(int) * (m+1));

	// 初始化前k项的值
	for (i = 0; i < k-1; ++i)
	{
		f[i] = 0;
	}
	f[k-1] = f[k] = 1;

	// 求第m项值
	for (i = k+1; i <= m; ++i)
	{
		// 按照数学公式计算
		f[i] = 2 * f[i - 1] - f[i - k - 1];
	}
	result = f[m];

	// 释放辅助空间
	free(f);

	return result;
}

/****************************************************
函数功能:
		求k阶fibnocci数列的第m项值
算法思想:
		递归求解。
函数参数:
		int		m		待求fibnocci数列项数
		int		k		fibnocci数列的阶数
返回值:
		返回k阶fibnocci数列第m项的值
时间复杂度:
		O(k^m):	由递归式:f(m) = k * f(m-1),
		则f(m) = k * k * f(m-2),以此类推可得,
		f(m) = k^m
空间复杂度:
		O(m * k):	每一次递归调用过程中需要求得其前k项的值,
		共需递归调用m次,故总共的辅助空间约为 m * k个。
*****************************************************/
int fibnocci_3(int m, int k)
{
	int i, result = 0;
	if (m < k - 1)
	{
		return 0;
	}
	else if (m == k - 1 || m == k)
	{
		return 1;
	}
	else
	{
		for (i = 1; i <= k; ++i)
		{
			result += fibnocci_3(m - i, k);
		}
		return result;
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档