斐波那契数列

算法拓展之斐波那契数列

◇◆丶佛笑我妖孽 提交于 2020-02-02 03:32:22
你可能不知道斐波那契数列是什么 但你一定见过此类数据 1 1 2 3 5 8 13 21 34 这类数据的题目在算法练习中我们也遇到过 第n个数等于它前两个数的和 我们通常的办法是打表,然后给你n再取其对应的值输出 其实它是有一个公式可以直接求的 这个公式仅适用于是1 1 2 3这样开始的 如果数列是1 2 3 5这样开始的 我们需要在输入的n后面再加1,来求值 如下面这个code # include <bits/stdc++.h> using namespace std ; int main ( ) { double n ; int ans ; while ( cin >> n ) { n ++ ; ans = ( pow ( ( 1 + sqrt ( 5 ) ) / 2 , n ) - pow ( ( 1 - sqrt ( 5 ) ) / 2 , n ) ) / sqrt ( 5 ) ; cout << ans << endl ; } return 0 ; } 需要注意的是,往往一个题目不会直接一个通项公式就让你ac 这类题目更常见的是要你结合高精度使用 来源: CSDN 作者: NEFU_kadia 链接: https://blog.csdn.net/NEFU_kadia/article/details/104137160

C语言经典例11-斐波那契数列

落爺英雄遲暮 提交于 2020-02-01 20:28:49
目录 1 题目 2 分析 3 实现 3.1 实现1(递归) 3.2 实现2(非递归) 4 运行结果 1 题目 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可) 2 分析 将该例建立数学模型,规律为1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, …,即下个月是上两个月之和,该模型在数学上称为fibonacci数列,通过这个规律可以构造递归函数,也可以构造非递归函数计算,显然递归函数的效率非常非常低,但是程序简洁明了。 3 实现 3.1 实现1(递归) # include <stdio.h> int fibonacci ( int n ) { if ( n == 1 || n == 2 ) { return 1 ; } else { return fibonacci ( n - 1 ) + fibonacci ( n - 2 ) ; } } int main ( ) { for ( int i = 1 ; i <= 40 ; i ++ ) { printf ( "第%d个月个数为%d\n" , fibonacci ( i ) ) ; } return 0 ; } 3.2 实现2(非递归) # include <stdio.h>

递归算法

六眼飞鱼酱① 提交于 2020-01-31 19:55:44
用递归计算斐波那契数列,那么什么是斐波那契数列呢?这里引用百度百科的定义:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义: F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) 代码如下: public class Test01 { public static void main(String[] args) { System.out.println(f(8)); } public static int f(int n) { if(n<=2) { return 1; } return f(n-2)+f(n-1); } } 用递归计算数,需要注意关键的三点。第一,必须有跳出的条件,否则会导致内存溢出,比如上面的代码找到了第8项,递归回调8次就跳出来了;第二,必须给初始值赋值,否则无法计算出数; 第三,需要推导出要计算的表达式。用递归计算斐波那契数列的表达式的规律为,前两项的加起来等于第三项,用数学表达式即为:F(n)=F(n - 1)+F(n - 2) 来源: https://www

《剑指Offer》斐波那契数列(Java 实现)

北战南征 提交于 2020-01-30 22:34:32
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。   n<=39 1.2 题目链接 《牛客网》:斐波那契数列 二、实现代码 public class Solution { public int Fibonacci ( int n ) { int pre = 0 , cur = 1 ; for ( int i = 1 ; i < n ; i ++ ) { int temp = cur ; cur += pre ; pre = temp ; } return n == 0 ? pre : cur ; } } 来源: CSDN 作者: 杨小帆_ 链接: https://blog.csdn.net/qq_40697071/article/details/104118936

斐波那契数列(C++ 和 Python 实现)

妖精的绣舞 提交于 2020-01-30 11:59:32
(说明:本博客中的 题目 、 题目详细说明 及 参考代码 均摘自 “何海涛《 剑指Offer:名企面试官精讲典型编程题 》2012年”) 题目 1. 写一个函数,输入 n, 求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: 2. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个n级的台阶总共有多少种跳法? 3. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级,...... ,也可以跳上n级,此时该青蛙跳上一个 n 级的台阶共有多少种跳法? 4. 用 2x1 (图 2.13 的左边)的小矩形横着或者竖着去覆盖更大的矩形。请问用 8 个 2x1 小矩形无重叠地覆盖一个 2x8 的大矩形(图 2.13 的右边),总共有多少种方法? 题目解析   本博客提及到 4 个题目:题目 1 直接给出斐波那契数列的定义,可采用多种算法实现,这些算法思想将在 “算法设计思想“ 部分介绍;题目 2 和题目 4 的本质上解决的还是斐波那契数列第 n 项的计算问题,即题目 1;题目 3 可以说是数学问题,只要意识到其计算的实质上是 2 的 n 次幂即可,剩下的工作采用程序就很容易实现了。   下面具体说如何理解题目 2、题目 3 和 题目4:   对于题目 2,青蛙每次只能跳上 1 级或 2 级台阶。假定青蛙需要跳上 n 级台阶,其可能的组合数为 g(n

斐波那契数列

落爺英雄遲暮 提交于 2020-01-29 13:46:58
斐波那契数列 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 输入格式 输入包含一个整数n。 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数。 问题求解 1.递归法求斐波那契数列 使用递归法求解斐波那契数列较为简单,易于理解。 C++代码 # include <iostream> using namespace std ; int fibo ( int n ) { if ( n == 1 || n == 2 ) return 1 ; else return fibo ( n - 1 ) + fibo ( n - 2 ) ; } int main ( ) { int x ; cin >> x ; cout << fibo ( x ) % 10007 ; return 0 ; } 2.非递归法求斐波那契数列 非递归法求斐波那契数列一般用于限定了执行时间或者运算资源有限的情况。 C++代码 # include <stdio.h> # include <iostream> using namespace std ; int main ( ) { int a1 , a2 ; a1 = a2 = 1 ; int p ; int x ; cin >> x ;

斐波那契数列对10007取余数

ぃ、小莉子 提交于 2020-01-27 00:10:58
Mn = ( Mn-1 + Mn-2 ) % 10007 因为 *F(n) = X1 * 10007 + Mn F(n+1) = X2 * 10007 +Mn+1 F(n+2) = F(n) + F(n+1) =(X1 + X2)+100007 + Mn + Mn+1 Mn+2 = F(n+2) / 10007 = Mn + Mn+1 所以 Mn = ( Mn-1 + Mn-2 ) % 10007 # include <iostream> int main ( ) { int a = 1 , b = 0 , sum = 0 , t = 0 , n ; std :: cin >> n ; while ( ++ t <= n ) { sum = ( a + b ) % 10007 ; a = b ; b = sum ; } std :: cout << sum ; return 0 ; } 来源: CSDN 作者: Yicay 链接: https://blog.csdn.net/qq_15757015/article/details/104089657

算法

血红的双手。 提交于 2020-01-26 10:16:43
算法 1、冒泡法排序 原始数据:15,20,1,6,9,13,55,3,24,33 (总元素个数:10个) 轮数 哪个元素进行比较 跟谁比较/比较次数 第一轮 a[0] a[1]-a[9] 第二轮 a[1] a[2]-a[9] 第三轮 a[2] a[3]-a[9] … … … 第n轮 a[n-1] a[n]-a[9] 第n+1轮 a[n] a[n+1]-a[9] … … … 第九轮/最后一轮 a[8] a[9] 算法原理:利用循环嵌套,外层循环控制比较的轮数,内层循环控制比较的次数。 程序代码: var a = [ 15 , 20 , 1 , 6 , 9 , 13 , 55 , 3 , 24 , 33 ] ; var t ; for ( var i = 0 ; i < a . length - 1 ; i ++ ) { for ( var j = i + 1 ; j < a . length ; j ++ ) { if ( a [ i ] > a [ j ] ) { t = a [ i ] ; a [ i ] = a [ j ] ; a [ j ] = t ; } } } 2、数组元素的去重 var x = [ 1 , 3 , 6 , 20 , 1 , 1 , 55 , 6 , 1 , 24 , 33 ] ; for ( var i = 0 ; i < x . length - 1

一个简洁的斐波那契求法和它的简单应用

落爺英雄遲暮 提交于 2020-01-25 22:04:05
这个简洁的求法其实是在做题的过程中发现的,但这道题的正规做法应该不是这样,所以我就先解释一下这种考找规律的斐波那契数列求法 事实上,只要细心观察,通过简单的数学推导很容易可以得到一个式子形如F(2n)=F(N)²+F(N+1)²就是F[N]=F[N/2]²+F[(N+1)/2]² 知道了这个式子后我们很容易的可以求出当目标为奇数时的递推关系(因为奇数本身除2自动约掉+1后除2即为n/2+1)但偶数会导致(N+1)/2自动约掉 n的大小一次可以减半,如果解决了偶数形式的问题我们就可以吧这一复杂度本来为2的n次方的递归问题优化为log2n性 于是我试着列了一个方程组如下图 在得出 可以解决这个问题 所以我们可以用log2n的递归完成对斐波那契的求解 下面我们看一下这个题的原题和题解 题目描述 Keven特别喜欢斐波那契数列,已知 fib1=1fib2​=1,对于 n>=3n>=3n>=3。fibn​=fibn−2​+fibn−1​,并且他想知道斐波那契前 n 项平方和是多少? 为了防止答案过大,请将最后的答案模 1e9+7 输入描述: 第一行一个整数 n(1<=n<=1e18) 输出描述: 在一行中输出斐波那契数列的前 n 项平方和模 1e9+7 问题就是求前n项斐波那契的平方和,可是这个题目的输入数据非常之大我们很难暴力枚举解决问题 这是我们借助一个图来作为辅助

c#斐波那契数列

╄→гoц情女王★ 提交于 2020-01-25 18:01:12
用控制台写的计算斐波那契数列 新建一个类 namespace 斐波那契数列 { class student { public int shy ( int index ) { if ( index < 1 ) { return 0 ; } else if ( index == 1 || index == 2 ) { return 1 ; } else { return shy ( index - 1 ) + shy ( index - 2 ) ; } } } } 主窗体 namespace 斐波那契数列 { class Program { static void Main ( string [ ] args ) { student stu = new student ( ) ; Console . WriteLine ( stu . shy ( 80 ) ) ; Console . ReadLine ( ) ; } } } 来源: CSDN 作者: Zombie° 链接: https://blog.csdn.net/weixin_45755086/article/details/103783633