斐波那契

查找--斐波那契查找

纵然是瞬间 提交于 2019-12-02 13:01:24
1、什么是斐波那契数列? 1、1、2、3、5、8、13、21、…… 斐波那契数列又被成为黄金分割数列,因为 前一项/后一项越来越趋近于0.618 由上面的数列,可以发现 除了前两项,后面每一项都是前两项的和,如3+5=8、8+13=21..... 由此可以得到一下等式 F(n)=F(n-1)+F(n-2) (除了前两项) 2、斐波那契查找和斐波那契数列有什么联系?   斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即 mid=low+F(k-1)-1 (F代表斐波那契数列)   关于F(k)-1 由斐波那契数列可知,F(k)=F(k-1)+F(k-2),那F(k)-1=(F(k-1)-1)+(F(k-2)-1)+1,所以数组长度只要满足 F(k)-1,就可以将数组分为F(k-1)-1和F(k-2)-1左右两部分,其中mid=low+F(k-1)-1 3、代码实现 目标;查找99 int[] a={0,16,24,35,47,59,62,73,88,99}; public static int MaxSize=20; //先为斐波那契数列设置长度 //构建你波拉契数列 public static int[] fib(){ int[] f=new int[MaxSize]; f[0]=1; f[1]=1; for

递归和非递归实现斐波那契数列

风流意气都作罢 提交于 2019-12-02 11:14:39
# include <stdio.h> # include <windows.h> int Fib1 ( int m ) { while ( m >= 2 ) { return Fib1 ( m - 1 ) + Fib1 ( m - 2 ) ; } return 1 ; } int Fib2 ( int n ) { int num ; int a = 1 ; int b = 1 ; if ( n <= 1 ) { return 1 ; } else { for ( int i = 2 ; i <= n ; i ++ ) { num = a + b ; a = b ; b = num ; } return num ; } } int main ( ) { int p = 8 ; printf ( "%d\n" , Fib1 ( p ) ) ; printf ( "%d\n" , Fib2 ( p ) ) ; system ( "pause" ) ; return 0 ; } 来源: https://blog.csdn.net/weixin_44792333/article/details/102754842

【每日一练】最长斐波那契子序列

▼魔方 西西 提交于 2019-12-02 08:42:55
题目描述 : 给定一个数组,找出其中最长的子序列,满足该子序列是斐波那契子序列 注: 如果序列 X 1 , X 2 , . . . , X n X_1, X_2, ..., X_n X 1 ​ , X 2 ​ , . . . , X n ​ 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X i + X i + 1 = X i + 2 X_i + X_{i+1} = X_{i+2} X i ​ + X i + 1 ​ = X i + 2 ​ 思路: 本题一开始想岔了,一直以为Fibonacci数列必须是严格按照{1,1,2,3,5,8……}的顺序的数组,后来才知道只要满足上式均可。 方法一:暴力算法,由于F数列每个数的生成只依赖前两个数,假设以x = a[i],y = a[j]为序列起始,只需计算下一个数字P = x + y,并判断P是否存在后续数组中。每次更新x,y ← \leftarrow ← y,P。 class Solution ( object ) : def lenLongestFibSubseq ( self , A ) : ans = 0 n = len ( A ) for i in range ( n ) : for j in range ( i + 1 , n ) : x , y = A [ j ] , A [ i

[算法]斐波那契

▼魔方 西西 提交于 2019-12-01 18:46:15
#include <iostream> #include <cmath> using namespace std; //2.斐波那契--递归版本 //fn=1;当n=0,1 //fn=fn-1+fn-2;当n>1 //算法复杂度O(2^n) static int fibonacci(int n) { if (n<=1) return 1; return fibonacci(n - 1) + fibonacci(n - 2); } //2.斐波那契--非递归版本 //1/sqrt(5) ( pow((1+sqrt(5))/2,n+1) - pow((1-sqrt(5))/2,n+1) ) //算法复杂度O(1) static int fibonacci_iter(int n) { return 1 / sqrt(5) * (pow((1 + sqrt(5)) / 2, n + 1) - pow((1 - sqrt(5)) / 2, n + 1)); } int main() { cout<<fibonacci(5)<<endl; cout<<fibonacci_iter(5)<<endl; cout << "hello world" << endl; return 0; } 来源: https://www.cnblogs.com/tailiang/p/11712843.html

HDU 1848 斐波那契博弈

≡放荡痞女 提交于 2019-12-01 13:52:59
斐波那契数列数列博弈:给你三堆石子,每次只能取费波契数列个石子,问先手赢输出“Fibo”,否则输出“Nacci”。 主要求出SG函数,然后看 异或值 ,最后根据异或值是否是 0 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[20]; int sg[1050], mex[1050]; int main() { int m,n,p; for(int i = 0; i <= 15; i++) //递推求斐波那契数列 if(i == 0 || i ==1) f[i] = 1; else f[i] = f[i-1] + f[i-2]; for(int i = 1; i <= 1000; i++) //从小到大递推每个状态 { memset(mex,0,sizeof(mex)); // 清空 mex for(int j = 1; j <= 15; j++) if(i >= f[j]) //石子数大于等于取的石子数,把后继的 放入 mex中 mex[sg[i-f[j]]] = 1; for(int j = 0; j <= 1000; j++) //求出该状态下 sg值 if(!mex[j]) { sg[i] = j; break; } } while(~scanf("%d%d

luoguP1306 斐波那契公约数

两盒软妹~` 提交于 2019-12-01 08:48:15
令 \(n<=m\) \[ \begin{eqnarray}f[n+2]&=&f[n]*f[1]+f[n+1]*f[2]\\ f[n+3]&=&f[n]*f[2]+f[n+1]*f[3]\\ &......&\\ f[m]&=&f[n]*f[m-n-1]+f[n+1]*f[m-n] \end{eqnarray} \] \[ \begin{align} \gcd(f[n],f[m])&=\gcd(f[n],f[n]*f[m-n-1]+f[n+1]*f[m-n])\\ &=\gcd(f[n],f[n+1]*f[m-n])\\ &=\gcd(f[n],f[m-n])\\ &=\gcd(f[n],f[m\%n]) \end{align} \] 就是辗转相除啦! \[ \begin{align} \gcd(f[n],f[m])=f[\gcd(n,m)] \end{align} \] 然后用矩阵快速幂优化即可. #pragma GCC optimize(3) #include<bits/stdc++.h> #define il inline #define rg register #define gi read<int> using namespace std; const int mod=1e8; template<class TT> il TT read() { TT o = 0, fl

斐波那契数

风格不统一 提交于 2019-11-30 17:59:23
在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。 它有一个递推关系, f(1)=1 f(2)=1 f(n)=f(n-1)+f(n-2),其中n>=2 3f(n)=f(n+2)+f(n-2) 斐波那契数是 由 线性递归方程 定义的数列 (1) 与 。作为定义( 1 )的结果,通常定义 。 ,2,... 的斐波那契数是 1,1,2,3,5,8,13,21 ,...(OEIS A000045 )。 斐波纳契数列可以被看作是在特定情况下 斐波纳契多项式 与 。 对于封闭形式 由下式给出 (3) 其中, 和 是的根源 。在这里, 所以等式变为 (4) 有 根 (5) 因此,闭合形式为 (6) 这就是 Binet的斐波那契数公式 (Wells 1986,第62页)。另一种封闭形式是 (7) (8) 其中, 是 最接近的整数函数 (Wells 1986,第62页)。 使用等式( 7 ),的定义 可以扩展到负整数 根据 (9) 更一般地,Fibonacci数可以扩展到 实数 通过 (10) 如上图所示。 Fibonacci函数在处有零, 并且有无限数量的负值可以逼近 所有负整数 ,由 (11) 其中 是 黄金比例 。最初的几个根源是0,

python之斐波那契序列算法的总结

不打扰是莪最后的温柔 提交于 2019-11-30 16:47:32
斐波那契序列为1,1,2,3,5,8,13.......序列中的下一个数字为之前前两个数字的运算和。 方法1:矩阵思想 [0,1] [a] [b]   [1,1] * [b] = [a+b] import pandas as pd import numpy as np def func(n): a=np.mat([[0,1],[1,1]]) b=np.mat([[1],[1]]) c=b for i in range(1,n): print(c[[1], [0]]) c=a*c func(50) 来源: https://www.cnblogs.com/xuehaiwuya0000/p/11604773.html

斐波那契(Fibonacci数列)

你。 提交于 2019-11-30 05:54:14
输出斐波那契(Fibonacci数列)的前n项。用递推实现: #include <stdio.h> #include <stdlib.h> void Fibonacci(int n) { int a1=1,a2=1,a3,i; if(n==1)printf("%d\n",a1); else if(n==2)printf("%d %d\n",a1,a2); else { printf("%d %d ",a1,a2); for(i=3; i<=n; i++) { a3=a1+a2; printf("%d ",a3); a1=a2; a2=a3; } } } int main() { int n; scanf("%d",&n); Fibonacci(n); return 0; } 来源: https://blog.csdn.net/weixin_43886377/article/details/101122425

Coffee Chicken (斐波那契字符串)

♀尐吖头ヾ 提交于 2019-11-30 03:55:33
S(1) = {"COFFEE"}S(1)="COFFEE"; S(2) = {"CHICKEN"}S(2)="CHICKEN"; S(n) = S(n-2) :: S(n-1) 1 ≤ n ≤500,1 ≤ k ≤ min{∣S(n)∣,10^12 } 给n和k 求出S(n)从第k位开始往后的10的字符 递归定位,枚举10个位 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define inf 0x3f3f3f3f const int maxn=505; const ll N=1e12+10; ll f[maxn]; string s[550]; int num; void solve(int n,ll k) { if(n==1) cout<<s[1][k-1]; else if(n==2) cout<<s[2][k-1]; else { if(k>f[n-2]) solve(n-1,k-f[n-2]); else if(k<=f[n-2]) solve(n-2,k); } } int main( ) { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin>>t; f[1]=6; f[2]=7; for(int