斐波那契数列递归解法
递归解斐波那契数列
斐波那契数列最直观的递归解法:
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),不同的只是他们的第一项 t0 和 t1。
斐波那契数列:
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项的问题,而且只需要知道 t0 和 t1 的值,我们就可以求出数列中的任意一项。所以我们可以写出一个函数:
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);
}
斐波那契数列递归解法相关推荐
- 数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)
栈与递归 程序中的"函数调用栈"是栈数据结构的一种应用. 函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处. 函数调用栈中存储的数据为活动记录.活 ...
- Haskell 斐波那契 数列 递归实现
Haskell 斐波那契 数列 递归实现 haskell let fibonacci n = if n < 3 then 1 else fibonacci (n-2) + fibonacci(n ...
- c语言斐波那契数列递归数组,c语言斐波那契数列递归法
斐波那契数列递归 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&quo ...
- C++ 斐波那契数列递归求解 进阶版
#include <iostream> #include <vector> using namespace std;int num = 0; vector<int> ...
- 斐波那契尾递归函数java_斐波那契数列 递归 尾递归 递推 C++实现
==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...
- 【编程5】斐波那契数列 + 递归+LeetCode50
传送门:https://leetcode-cn.com/problems/powx-n/ 一.LeetCode 50. Pow(x, n) 1.题目描述 实现 pow(x, n) ,即计算 x 的 n ...
- python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...
题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,--..,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def fib ...
- [剑指offer]面试题第[7]题[JAVA][斐波那契数列][递归]
[问题描述] 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 [解答思路] 1.递归(面试避免) O(n^2) public ...
- python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法
Q10.斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项. 解题思路 思路一 递归 递归很简单但是并不能AC python实现代码 class Solution: def Fibon ...
最新文章
- gin路由打开html页面,Gin(二):使用路由
- 在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
- Codis的dashboard异常退出后,重新启动报异常的处理方法
- docsify——一个神奇的文档站点生成器
- Spring Boot 整合 Netty和Protobuf
- 小米虚高的估值泡沫要破了么?
- IIS7部署网站出现500.19错误(权限不足)的解决方案
- Linux Rsync服务详解(二)——Rsync服务实战
- 基因组信息学参考习题
- php实现给excel(xlsx)文件添加背景图水印
- 七代处理器装win7_Intel7代处理器 win10重装win7后无法安装显卡声卡驱动的解决方案 | A小可私人狗窝...
- 链路追踪Logback-ERROR日志邮件发送
- 桌面图标变白,任务栏图标变白
- 继电器控制电路原理解析说明
- 金桔蓝牙网关蓝牙连接协议说明
- docker常见面试题
- 西部世界科普时间:FIL将从4月15日开始减产? 谣言!
- 数据库的事务ACID特性以及MySQL如何保持事物特性
- I2C的ACK和NACK
- [APK签名] jarsigner APK V1签名