【笔试】27、斐波那契数列

写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下

我们的第一反应是使用递归来做,但是实际上递归的效率非常之低

public static long TiaoJi(int n)
	{
		if(n <= 0)
			return 0;
		if(n == 1)
			return 1;

		return TiaoJi(n - 1) + TiaoJi(n - 2);
	}

其实我们可以用循环

/**
 *题目:1、写一个函数,输入n,求斐波那契数列的第n项。
 *	   2、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法
 *时间:2015年8月27日11:24:37
 *文件:Fibonacci.java
 *作者:cutter_point
 */
package bishi.Offer50.y2015.m08.d27;

public class Fibonacci
{
	/**
	 * 求斐波那契数列
	 * @param n
	 * @return
	 */
	public static long getFibonacci1(int n)
	{
		if(n <= 0)
			return -1;
		else if(n == 1)
			return 0;
		else if(n == 2)
			return 1;
		long first = 0;
		long second = 1;
		long result = 0;

		for(int i = 3; i <= n; ++i)
		{
			result = first + second;
			first = second;
			second = result;
		}

		return result;
	}

	/**
	 * 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法
	 * @param n
	 * @return
	 * 台阶数  跳法
	 * 1	1
	 * 2	2
	 * 3	3
	 * 4	5
	 * 5	8
	 * 发现是一个斐波拉契数列
	 */
	public static long TiaoJi(int n)
	{
		if(n <= 0)
			return 0;
		if(n == 1)
			return 1;

		return TiaoJi(n - 1) + TiaoJi(n - 2);
	}

	public static void main(String[] args)
	{
		System.out.println(TiaoJi(40));
	}
}

第二题,也可以用循环来做,方法和上面那个基本一样!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 08:19:30

【笔试】27、斐波那契数列的相关文章

【笔试】1、斐波拉契数列

/* * 题目:题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死, 问每个月的兔子总数为多少? * 时间:2015年7月27日08:47:08 * 文件:lianxi01.cpp * 作者:cutter_point */ #include <iostream> #include <fstream> using namespace std; int main() { ifstream input("li

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)

空间 512M  时限2s [题目描述] 有n个大于1的正整数a1,a2,…,an,我们知道斐波那契数列的递推式是f(i)=f(i-1)+f(i-2),现在我们修改这个递推式变为f(i)=f(i-1)+f(i-2)+r(i-1),其中r(x)为a1,a2,…,an中为x的约数的个数.现在要求f(m) mod 19940417的值.注:初值f(1)=1,f(2)=1 输入格式: 第一行两个数n,m. 接下来一行n个正整数a1,a2,…,an. 输出格式: 输出一行仅一个数,f(m) mod 199

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

HDU 5451 广义斐波那契数列

这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2) = 10*f(n-1) - f(n-2) 那么就可以写成矩阵相乘的形式了 (f(n) , f(n-1))

斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n).第一个斐波拉契数为F(0) = 1. 给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007. 斐波拉契数列的计算是一个非常经典的问题,对于小规模的n,很容易用递归的方式来获取,对于稍微大一点的n,为

斐波那契数列和反向计算问题

反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数. 十进制整数转换为二进制整数采用"除2取余,逆序排列"法. 具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列

ACM2 斐波那契数列

描述 在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义: F0 = 0 F1 = 1 Fn = Fn - 1 + Fn - 2 用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就由之前的两数相加.首几个斐波那契数是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,……………… 特别指出:0不是第一项,而是第

51Nod - 1242 斐波那契数列的第N项

斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. Input输入1个数n(1 <= n <= 10^18).Output输出F(n) % 1000000009的结果.Sample Input 11 Sam