递归解斐波那契数列

斐波那契数列最直观的递归解法:

int fib(int n){if (n<2) { return n;} else {return fib(n-1) + fib(n-2);}
}

然而这种解法效率很低,会进行很多重复运算

例如:当计算 fib(5) 时,我们共需要计算1次 fib(4),2次 fib(3),3次 fib(2),5次 fib(1) 和3次 fib(0)。这些无意义的重复计算使得递归效率极低。

递归解法的优化

实际上像斐波那契这样的数列还有很多,他们都满足相同的规律,即从第三项开始,每一项等于前两项之和。这样的数列被统称为可加数列(additive sequence),不同的只是他们的第一项 t0t1

斐波那契数列:
0,1,1,2,3,5,8,13,21,34,55,…0, 1, 1, 2, 3, 5, 8,13,21, 34,55,\dots0,1,1,2,3,5,8,13,21,34,55,…

如果我们将它的第一项和第二项换成3和7,就会变成:
3,7,10,17,27,44,71,115,186,…3, 7, 10, 17, 27, 44, 71,115,186, \dots3,7,10,17,27,44,71,115,186,…

因此,求解斐波那契数列第n项的问题可以被转化成求解一个可加数列的第n项的问题,而且只需要知道 t0t1 的值,我们就可以求出数列中的任意一项。所以我们可以写出一个函数:

int additiveSequence(int n, int t0, int t1);

下一步就是实现这个函数。继续观察可加数列,我们可以发现一个可加数列S中的第n项等于将这个数列每一项都向前移一位的新数列的第n-1项。

例如,原数列中的t6 = 71:

当我们将该数列每一位都向前移动一位,得到一个新数列,此时 t5 = 71:

而这个新的 t0 等于原数列的 t1,新的 t1 等于原数列的 t0 + t1

因此函数可以写为:

int additiveSequence(int n, int t0, int t1){if (n==0) return t0;if (n==1) return t1;return additiveSequence(n-1, t1, t0+t1);
}

递归求解斐波那契数列的完整函数就可写为:

int fib(int n){return additiveSequence(n, 0, 1);
}int additiveSequence(int n, int t0, int t1){if (n==0) return t0;if (n==1) return t1;return additiveSequence(n-1, t1, t0+t1);
}

斐波那契数列递归解法相关推荐

  1. 数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)

    栈与递归 程序中的"函数调用栈"是栈数据结构的一种应用. 函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处. 函数调用栈中存储的数据为活动记录.活 ...

  2. Haskell 斐波那契 数列 递归实现

    Haskell 斐波那契 数列 递归实现 haskell let fibonacci n = if n < 3 then 1 else fibonacci (n-2) + fibonacci(n ...

  3. c语言斐波那契数列递归数组,c语言斐波那契数列递归法

    斐波那契数列递归 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&quo ...

  4. C++ 斐波那契数列递归求解 进阶版

    #include <iostream> #include <vector> using namespace std;int num = 0; vector<int> ...

  5. 斐波那契尾递归函数java_斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

  6. 【编程5】斐波那契数列 + 递归+LeetCode50

    传送门:https://leetcode-cn.com/problems/powx-n/ 一.LeetCode 50. Pow(x, n) 1.题目描述 实现 pow(x, n) ,即计算 x 的 n ...

  7. python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...

    题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,--..,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def fib ...

  8. [剑指offer]面试题第[7]题[JAVA][斐波那契数列][递归]

    [问题描述] 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 [解答思路] 1.递归(面试避免) O(n^2) public ...

  9. python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法

    Q10.斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项. 解题思路 思路一 递归 递归很简单但是并不能AC python实现代码 class Solution: def Fibon ...

最新文章

  1. gin路由打开html页面,Gin(二):使用路由
  2. 在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
  3. Codis的dashboard异常退出后,重新启动报异常的处理方法
  4. docsify——一个神奇的文档站点生成器
  5. Spring Boot 整合 Netty和Protobuf
  6. 小米虚高的估值泡沫要破了么?
  7. IIS7部署网站出现500.19错误(权限不足)的解决方案
  8. Linux Rsync服务详解(二)——Rsync服务实战
  9. 基因组信息学参考习题
  10. php实现给excel(xlsx)文件添加背景图水印
  11. 七代处理器装win7_Intel7代处理器 win10重装win7后无法安装显卡声卡驱动的解决方案 | A小可私人狗窝...
  12. 链路追踪Logback-ERROR日志邮件发送
  13. 桌面图标变白,任务栏图标变白
  14. 继电器控制电路原理解析说明
  15. 金桔蓝牙网关蓝牙连接协议说明
  16. docker常见面试题
  17. 西部世界科普时间:FIL将从4月15日开始减产? 谣言!
  18. 数据库的事务ACID特性以及MySQL如何保持事物特性
  19. I2C的ACK和NACK
  20. [APK签名] jarsigner APK V1签名

热门文章

  1. virtual box挂载 共享文件夹
  2. python提取字符串中的 中文 日文 韩文
  3. Python 实现冒泡
  4. 列出5个python标准库_Python常用标准库使用(一)
  5. 设计一个有getMin功能的栈 (python)
  6. 集成学习(一)—预备知识:分类树和回归树
  7. 文巾解题 981. 基于时间的键值存储
  8. Flink从入门到精通100篇(二十三)-Apache Flink在滴滴的应用与实践
  9. LDA主题模型——gensim实战
  10. python实现自动发送微博,当自己写博客时同步上去。