Solution 19: Fibonacci数列

问题描述

求Fibonacci数列的第n项。Fibonacci数列为1,1,2,3,5,...

解决思路

(1) 递归,指数级时间复杂度;

(2) 循环,O(n)时间复杂度;

(3) 矩阵乘法,O(logn)时间复杂度;

(4) 公式法,O(1)时间复杂度。

程序

public class Fibonacci {
	public int getNthElemRec(int n) {
		if (n <= 0) {
			return -1;
		}
		if (n <= 2) {
			return 1;
		}
		return getNthElemRec(n - 1) + getNthElemRec(n - 2);
	}

	public int getNthElemNoRec(int n) {
		if (n <= 0) {
			return -1;
		}
		if (n <= 2) {
			return 1;
		}

		int a = 1, b = 1;
		int res = 0;

		while (n >= 3) {
			res = a + b;
			a = b;
			b = res;
			--n;
		}

		return res;
	}
}

  

时间: 2024-10-10 04:28:05

Solution 19: Fibonacci数列的相关文章

蓝桥杯算法训练 java算法 Fibonacci数列

问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单. 样例输入 10 样例输出 55 样例输

codevs1732 Fibonacci数列 2 傻逼的不能再傻逼的矩乘,然而我还WA过!

1732 Fibonacci数列 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值.但是1250中,n<=109.现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000 输入描述 Input Description 输入有多组数据,每组数据占一行,

c语言:用数组来处理求Fibonacci数列问题

用数组来处理求Fibonacci数列问题. 解:程序: #include<stdio.h> int main() { int i, f[20] = { 1,1 };//对最前面两个元素f[0]和f[1]赋初值1 for (i = 2; i < 20; i++) { f[i] = f[i-2]+f[i-1];//先后求出f[2]~f[19]的值 } for (i = 0; i<20; i++) { if (i % 5 == 0)//控制每输出5个数后换行 { printf("

1250 Fibonacci数列(矩阵乘法快速幂)

1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30000. 输入描述 Input Description 第一行一个数T(1<=T<=10000). 以下T行,每行两个数,n,q(n<=109, 1<=q<=

【蓝桥杯】入门训练 Fibonacci数列

入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余

【算法导论学习-28】Fibonacci数列及其相关

1.解决方案 Fibonacci数列增长很快,第100个已经到了10的20次方,64位计算机才表示到19次方.所以这里统一采用计算第40个数来比较性能.实际上,4个字节的int类型只能计算到第48个Fibonacci数(以0.1.1.2开头)为1836 311 903,一个18亿左右的数字. 1)递归方法--写法简单,效率非常低下 public class Fibonacci { /** * @param args */ public static void main(String[] args

Fibonacci数列的快速幂算法

设Fibonacci数列定义为: 请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项. 本题不涉及高精度数. 1 #include<stdio.h> 2 typedef struct matrix{ 3 int m[2][2]; 4 }matrix; 5 6 matrix multi(matrix a, matrix b) 7 { 8 int i, j, k; 9 matrix tmp; 10 for( i = 0; i < 2; ++i) 11 { 12 for( j =

【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归和非递归的 下面的代码有个问题,没有考虑大数越界.返回值应该设成long long型的 递归速度非常慢 /* 第 19 题(数组.递归): 题目:定义 Fibonacci 数列如下: / 0 n=0 f(n)= 1 n=1 / f(n-1)+f(n-2) n=2 输入 n,用最快的方法求该数列的第

矩阵乘法快速幂 codevs 1732 Fibonacci数列 2

1732 Fibonacci数列 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值.但是1250中,n<=109.现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000 输入描述 Input Description 输入有多组数据,每