斐波那契数列

斐波那契数列Fibonacci问题—动态规划

家住魔仙堡 提交于 2019-12-10 04:00:10
斐波那契数列定义 Fibonacci array:1,1,2,3,5,8,13,21,34,... 在数学上,斐波那契数列是以递归的方法来定义: F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2) 用文字描述,就是斐波那契数列由0和1开始,之后的斐波那契系数就是由之前的两数之和想加而得,首几个斐波那契数列系数是:0,1,1,2,3,5,8,13,21,34,55,...特别指出:0不是第一项,而是第零项。 递归解法 最容易想到的解法自然是按照公式的递归解法,具体实现如下: int fib(int n) { if (n < 2) return n; return fib(n-1) + fib(n-2); } 但其实该递归解法会重复两次计算 fib(n-2) 项,时间数量级远远超过 n,是指数级别的增长,时间复杂度很高,如下图所示,更因递归调用占用大量的堆栈空间,对程序而言是一种灾难。所以该种解法如果在面试中肯定是不能让面试官满意的。 动态规划法 从上图的数据可以看出,递归算法对每个子问题都要重新计算。而实际上,若利用“动态规划”思想这是没必要的。对于已经计算完的子问题,下次再遇到直接使用。将已经计算的结果保存在数组中,在后面直接使用,避免重复计算。具体实现如下: int fib(int n) { if (n <= 2) return n; vector

剑指offer——10.斐波那契数列

白昼怎懂夜的黑 提交于 2019-12-09 20:39:21
题目: 题1:现在要求输入一个整数n,请你输出斐波那契数列的第n项。 题2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题3:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题4:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路解析: 题1:从下往上计算,保存中间计算过程的结果,循环 题2:跳上第n阶台阶时可以分成两种情况,(1)最后一步跳1阶,则f(n) = f(n-1); (2)最后一次跳2阶,则f(n) = f(n-2); 即f(n) = f(n-1) +f(n-2) 题3:和2的思路一致,f(n) = f(n-1) +f(n-2) +f(n-3)+......+f(1)+1,解得f(n) = 题4:盖满大矩阵的最后一步也可以分两种情况,(1)竖着盖,则f(n) = f(n-1); (2)横着盖,其对应的下面或上面也得横着盖,则f(n) = f(n-2);即f(n) = f(n-1) + f(n-2) 代码实现: package jzoffer; import com.sun.corba.se.spi.orbutil.fsm.Guard.Result; import com.sun

Stream流实现斐波那契数列

流过昼夜 提交于 2019-12-08 17:19:32
1.前言 我们都知道斐波那契数列有很多种实现方法,在jdk1.8以前没有流操作,只能通过递归或者迭代等其他方式来实现斐波那契数列, 但是jdk1.8以后,有了流操作,我们就可以使用流来实现斐波那契数列. 2.代码 Stream.iterate(new int[] {0, 1}, i -> new int[] {i[1], (i[0] + i[1])}) .limit(10) .forEach(i -> System.out.print(i[0]+", ")); //0, 1, 1, 2, 3, 5, 8, 13, 21, 34, Stream.iterate生成一个无限流,所以这里使用limit把数量限制在了10,使用int数组来存储结果,每次流操作返回的 new int[] {i[1], (i[0] + i[1])})第二个为前两个数字之和,正好符合斐波那契数列,所以也不用搞什么迭代,递归等等,直接流操作来实现吧.而且流操作在内部也会优化,使用cpu的多处理器来处理数据,不用考虑并发问题.技术的发展不可避免,我们能做的只是跟上技术的发展,可以看到很多实现在jdk1.8的环境上已经变得很简单了. 来源: https://www.cnblogs.com/lishuaiqi/p/12006292.html

js计算斐波那契数列

﹥>﹥吖頭↗ 提交于 2019-12-08 15:48:32
/** * 要求:使用js计算斐波那契数列,时间复杂度尽量低。输入数字n,输出数列内第n位的值 * * 斐波那契数列如下: * 1、2、3、5、8、13、21、34、 * * 结果验证: * 输入8、输出34 * 输入10、输出89 * 输入20、输出10946 */ // 无缓存版本 var calFibonacci = function(n) { // 迭代次数统计 var count = 0; function _calFibonacci(n) { // 迭代次数统计 count++; if (n === 1) return 1; if (n === 2) return 2; return _calFibonacci(n-1) + _calFibonacci(n-2); } var result = _calFibonacci(n); // 输出迭代次数统计 console.log(count); return result; }; /** * 讨论: * 递归有什么优点和缺点? */ // 缓存版本 var calFibonacci = function(n) { var cache = {}; // 迭代次数统计 // var count = 0; function _calFibonacci(n) { // 迭代次数统计 // count++; if (n === 1)

循环-小蜜蜂-斐波那契数列-大数加法

前提是你 提交于 2019-12-07 17:43:56
【题】 小蜜蜂(选作) 一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。 请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。 输入: 分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a<b 。) 输出: 方案数量。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1 4↵ 以文本方式显示 3↵ 1秒 64M 0 测试用例 2 以文本方式显示 1 5↵ 以文本方式显示 5↵ 1秒 64M 0 测试用例 3 以文本方式显示 1 50↵ 以文本方式显示 12586269025↵ 1秒 64M 0 测试用例 4 以文本方式显示 2 50↵ 以文本方式显示 7778742049↵ 1秒 64M 0 测试用例 7 以文本方式显示 1 100↵ 以文本方式显示 354224848179261915075↵ 1秒 64M 0 【分析】 分析可知,这是一个斐波那契数列。需要注意的是,C语言中所有的类型都不能表示题中的数值,需要用到大数加法。 【代码】 (1)先给出斐波那契数列的求法: #include "stdio.h" int main() { int a, b; scanf("%d %d

#2019120700019-LG 斐波那契数列

寵の児 提交于 2019-12-07 07:58:35
P1962 P3986等基础模板 1 递归(自调用) //加入优化 #include <iostream> #include <cstring> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; int fib[5005]; int f(int g){ if(g==1||g==2) return 1; if(fib[g]!=-1) return fib[g]; fib[g]=f(g-1)+f(g-2); return fib[g]; } int main( ){ //memset(fib,-1,sizeof(fib)); for(int i=1;i<=5005;i++) fib[i]=-1; int a; int n; scanf("%d",&n); while(n--){ scanf("%d",&a); printf("%d\n",f(a)); } return 0; } 2 递推 (先读入后递归) #include<cstdio> #include <cstring> using namespace std; int main( ){ int f[1000005]; int n; scanf("%d",&n); while(n--){ memset(f,0,sizeof(f)

假期Noip笔记

纵然是瞬间 提交于 2019-12-06 15:17:58
(一)排序 ①选择排序 \(O(n^2)\) ②冒泡排序 \(O(n^2)\) ③快速排序 sort \(O(nlog n)\) ④归并排序 \(O(nlog n)\) ⑤桶排序(基数排序) (二)科学记数法 \(x=aeb+c=a\times 10^b+c\) (三)取模运算公式 A \((a\pm b)\% p=(a\%p \pm b\%p)\%p\) B \((a\times b)\% p=(a\%p \times b\%p)\%p\) 当 \(a-b<0\) ,那就使 \(((a-b)\%p+p)\%p\) 其中 \(-p-1 \leq (a-b)\%p<0\) 推广:对斐波那契数列的第 \(n\) 项取模等于 \(k\) 的数,有 \(f(n)\%1000=(f(n-1)\%1000+f(n-2)\% 1000)\%1000\) : 于是,记录 \(f'(n-1)=(f(n-1)\%1000\) 和 \(f'(n-2)=(f(n-2)\%1000\) ,则: \(f(n)\%1000=(f'(n-1)+f'(n-2))\%1000\) 对第 \(f(i)\) 项,与 \(f(i-j_{1})\) 和 \(f(i-j_{2})\) 有关(已知 \(j_{1},j_{2}\) )使用递推 斐波那契数列通项公式 \(f(n)=\frac{1}{\sqrt{5}}\left [

生成器实现斐波那契数列

Deadly 提交于 2019-12-06 15:05:39
#生成器生成斐波那契数列 def Fibnacc(num): 2 a= 1 3 b = 1 4 current_index = 0 5 while current_index<num: 6 data = a 7 8 current_index+=1 9 a,b=b,a+b 10 yield data 11 # yield:1.充当返回值的作用2.保存程序的运行状态,并且暂停程序执行3.当next的时候,可以继续换行程序从yield位置继续向下 12 # 执行 13 14 if __name__ == '__main__': 15 fib = Fibnacc(6) 16 for i in range(6): 17 value = next(fib) 18 print(i,"列",value) 来源: https://www.cnblogs.com/liuxjie/p/11991629.html

迭代器-斐波那契数列

你离开我真会死。 提交于 2019-12-06 14:58:06
使用迭代器实现斐波那契数列 1 class Finacci(object): 2 def __init__(self,num): 3 self.num = num 4 self.a = 1 5 self.b = 1 6 self.current_index=0 7 def __iter__(self): #定义迭代器 8 return self 9 def __next__(self): 10 if self.current_index<self.num: 11 data = self.a 12 self.a=self.b 13 self.b=self.a+self.b 14 self.current_index+=1 15 return data 16 else: 17 raise StopIteration 18 19 if __name__ == '__main__': 20 fib = Finacci(5) 21 # val = next(fib) 22 for value in fib: 23 print(value) 来源: https://www.cnblogs.com/liuxjie/p/11991363.html

斐波那契数列

烈酒焚心 提交于 2019-12-06 10:19:23
def f(n): if n==1: return 0 elif n==2: return 1 return f(n - 1) + f(n - 2)n = int(input("请输入一个数字:"))print(f(n))for i in range(1,n+1): print(f(i),end=" ") 来源: https://www.cnblogs.com/lihe94/p/11977111.html