斐波那契数列

递归算详细总结

断了今生、忘了曾经 提交于 2019-12-28 19:41:33
斐波那契数列 定义: 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........,这个数列从第3项开始,每一项都等于前两项之和。 斐波那契数列又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。 代码: import org.junit.jupiter.api.Test; /** * 斐波那契数列 * @author wydream * */ public class Algorithm_1 { /** * 用递归实现斐波那契数列,适用于求解比较小的位置数值 * 0 1 1 2 3 5 8 13 21... * @param n * @return */ public int getNum(int n) { if(n<=2) { return 1; }else { return getNum(n-1)+getNum(n-2); } } @Test public void

算法4--斐波那契数列

核能气质少年 提交于 2019-12-27 17:59:50
#include <stdio.h> #include <conio.h> #define NUM 13 int main() { int i; long fib[NUM] = {1,1}; for(i=2; i<NUM; i++){ fib[i] = fib[i-1] + fib[i-2]; } for(i=0;i<NUM;i++){ printf("%d月兔子总数:%d\n",i,fib[i]); } getch(); return 0; } 来源: CSDN 作者: 韩淼燃 链接: https://blog.csdn.net/weixin_36691991/article/details/103732831

面试官问你斐波那契数列的时候不要高兴得太早

£可爱£侵袭症+ 提交于 2019-12-23 02:11:17
原文地址:https://www.yanbinghu.com/2019/01/07/16863.html 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了。如果真这么想,那就危险了。 递归求斐波那契数列 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 斐波那契数列的计算表达式很简单: F(n) = n; n = 0,1F(n) = F(n-1) + F(n-2),n >= 2; 因此,我们能很快根据表达式写出递归版的代码: /*fibo.c*/#include <stdio.h>#include <stdlib.h>/*求斐波那契数列递归版*/unsigned long fibo(unsigned long int n){ if(n <= 1) return n; else return fibo(n-1) + fibo(n-2);}int main(int argc,char *argv[]){ if(1 >= argc) { printf("usage:./fibo num\n"); return -1; } unsigned long n = atoi(argv[1]); unsigned long fiboNum = fibo(n); printf("the %lu result is %lu\n",n

【剑指Offer】斐波那契数列

China☆狼群 提交于 2019-12-23 01:05:17
斐波那契数列1,1,2,3,5... 数列从第三项开始,每一项等于前两项和。 递归公式为:f(1)=f(2)=1,f(n)=f(n-1)+f(n-2),n>=3。 递归解法: public class Solution { public int Fibonacci(int n) { if(n<=1){ return n; } return Fibonacci(n-1) + Fibonacci(n-2); } } 非递归解法 public class Solution { public static int Fibonacci(int n) { int preNum=1; int prePreNum=0; int result=0; if(n==0) return 0; if(n==1) return 1; for(int i=2;i<=n;i++){ result=preNum+prePreNum; prePreNum=preNum; preNum=result; } return result; } 时间复杂度O(n),空间复杂度O(1) 来源: CSDN 作者: 少年阿峣_从零单排 链接: https://blog.csdn.net/qq_18769269/article/details/103656388

python实现斐波那契数列笔记

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-19 02:24:15
斐波那契数列即著名的兔子数列:1、1、2、3、5、8、13、21、34、…… 数列特点:该数列从第三项开始,每个数的值为其前两个数之和,用python实现起来很简单: a=0 b=1 while b < 1000: print(b) a, b = b, a+b 输出结果: 这里 a, b = b, a+b 右边的表达式会在赋值变动之前执行,即先执行右边,比如第一次循环得到b-->1,a+b --> 0+1 然后再执行赋值 a,b =1,0+1,所以执行完这条后a=1,b=1 a=0 b=1 while b < 1000: print(b,end=',')#end 可以将print输出到同一行并以 ,号结尾 a, b = b, a+b 输出结果: 递归方式实现斐波那契数列 前n项: # 递归方式实现 生成前20项 lis =[] for i in range(20): if i ==0 or i ==1:#第1,2项 都为1 lis.append(1) else: lis.append(lis[i-2]+lis[i-1])#从第3项开始每项值为前两项值之和 print(lis) 运行结果 来源: https://www.cnblogs.com/wolfshining/p/7662453.html

#2019120700019-LG 斐波那契数列

谁说我不能喝 提交于 2019-12-18 16:43:06
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)

【算法】动态规划:适合新手的动态规划入门常见题目详解

北慕城南 提交于 2019-12-17 02:51:09
动态规划 一、什么是动态规划 1.官方定义 2.动态规划的特点 二、题目练练手 1.斐波那契数列 2.爬楼梯 3.最大连续子数组和 4. 打家劫舍 一、什么是动态规划 1.官方定义 动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。 2.动态规划的特点 看官方的解释大家应该都会比较懵,通俗的来讲,动态规划就是大事化小,小事化无。要解决一个大问题就将大问题拆解成小问题,通过逐个解决这些小问题,最终解决问题。 动态规划可以说是递归方法的一种优化,在递归问题中,我们需要进行大量的重复计算过程,时间复杂度极高。于是就有了将计算过的结果保存起来,每一个子问题只需要计算一次就好。动态规划实际也是使用 空间换时间 的一种做法。于是动态规划问题就具有这样的特点: 问题可以逐步拆解 所有子问题只需解决一次 对子问题进行存储 在解决动态规划问题时,通常就是以下三个步骤: 状态定义 初始化 状态转移方程

斐波那契数列升级版—大数相加

别说谁变了你拦得住时间么 提交于 2019-12-12 12:40:39
斐波那契数列之第n项 求Fibonacci数列的第n项f[n]. f[0]=1; f[1]=1 ; f[n]=f[n-1]+f[n-2]; 输入格式 输入一个不超过10000的正整数n。 输出格式 输出Fibonacci数列的第n项的值。 输入样例 99 输出样例 354224848179261915075 由于是最大到第9999项,显然不能用传统的整型数据类型去递归相加。 那就要 定义数组 对斐波那契数列的每一项进行 模拟加法求和 , 来得到结果。 先放上实现的代码 # include <iostream> # include <string> # include <cstring> using namespace std ; const int N = 5005 ; int main ( ) { char f0 [ N ] = { '1' } , f1 [ N ] = { '1' } ; //初始化数组,第一个元素为字符1,其他为空字符 char * p1 , * p2 ; int n , temp , c , j , x = 0 , maxlen , minlen , i ; cin >> n ; //第n项 for ( i = 1 ; i < n ; i ++ ) { //求第n项的循环。如:求第2项只需要执行一次 c = 0 ; j = 0 ; //c作为进位的数值

著名数列及其算法(斐波拉契)

自作多情 提交于 2019-12-11 23:15:47
1、斐波那契数列 2、帕多瓦数列 3、卡特兰数 4、Look-and-say 数列 5.递推数列 – – 1、斐波那契数列 斐波那契数列,又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,提出时间为1202年。 指的是这样一个数列:1、1、2、3、5、8、13、21、34、…;在数学上, 斐波那契数列以如下被以递归的方法定义: F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) (n>2,n∈N*)。 方法一:递归方法 function f(n) { if ( n 1 || n 2 ){ return 1; }else{ return f(n-1) + f(n-2); } } console.log(f(6)); 方法二:动态规划方法(性能得到优化) function fibonacci(n) { let n1 = 1, n2 = 1, sum = 1; for(let i = 3; i <= n; i += 1) { sum = n1 + n2; n1 = n2; //往后移动一位数 n2 = sum } return sum } console.log(fibonacci(5)); 2、帕多瓦数列 帕多瓦数列是由帕多瓦总结而出的。 它和斐波拉契数列非常相似,稍有不同的是:每个数都是跳过它前面的那个数

7.递归和循环

旧街凉风 提交于 2019-12-11 11:05:39
动态规划(递归)解题步骤:   1.将原问题拆分成子问题。   2.确认状态。   3.确认边界状态(初始条件)。   4.状态转移方程。 题一:【斐波那契数列】 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 分析:斐波那契数列:{0 1 1 2 3 5 8 13 21 44……}   F(0)=0   F(1)=1   F(2)=F(1)+F(0)   F(3)=F(2)+F(1)   ...   F(n)=F(n-1)+F(n-2) 1 public class Solution { 2 //递归 O(2^n) 3 public int Fibonacci(int n) { 4 if(n==0||n==1) return n; 5 return Fibonacci(n-1)+Fibonacci(n-2); 6 } 7 } 1 public class Solution { 2 //循环O(N) 3 public int Fibonacci(int n) { 4 if(n==0||n==1) return n; 5 int first = 1; 6 int second =0; 7 for(int i=2;i<=n;i++){ 8 first = first + second;//F(n)=F(n-1)+F(n