递归与迭代 | 求斐波那契数列第n项值的四种算法
前言:
昨儿晚上三点多睡不着,不知道胡思乱想了些啥,好不容易睡着了又做了些稀奇古怪的梦。考研还是继续,真难。
这一篇博客记录一下求斐波那契数列第n项值得几种方法,用到了递归和迭代的方法,所以首先我们来区分一下递归和迭代,再来记录几种方法。
递归和迭代
联系
递归与迭代都是循环的一种。
区别
1、程序结构不同
- 递归是重复调用函数自身的循环。
- 迭代是函数内部代码的循环。
- 注意:迭代和普通循环的区别:迭代时,循环代码中参与计算的变量也是要返回的结果,当前保存的结果作为下一次循环计算的初始值。
2、算法结束方式不同
- 递归是在遇到满足终止条件的情况时结束循环。
- 迭代是使用计数器结束循环。
- 注意:很多情况会采用多种循环混合采用。
3、效率不同
- 在循环的次数较大时,迭代的效率明显高于递归。
求斐波那契数列第n项值
递归方法:
思想:
利用斐波那契数列计算公式f(n) = f(n-1) + f(n-2),递归调用函数自己。时间复杂度为O(2^n)。
代码:
// 斐波那契数列--递归:O(2^n)function fib(n) {if(n<2) {return n;}return fib(n-1) + fib(n-2);}console.log(fib(8));
注意:
此段代码中if(n<2) {return 0;}其实不够严谨,因为这样的话即使传入参数n为负数(如-1)也会返归n,在没有严格规定实参必须为非负整数的情况下,最好还是写成if(n == 0) return 0; if(n == 1) return 1;。
递归方法优化:
思想:
上述递归的方法,每一次执行到f(n-1)和f(n-2)时都要重新计算一遍,还要开辟新的空间来保存它们,比较浪费空间,可以优化为:开辟一个缓存区,存放计算过的每一个值,下一次用到时直接从缓存区查找,找不到则再计算,如此,可以减少空间上的浪费。
代码:
// 优化递归--结构体当缓存区function fib1(n) {const cache = {'0': 0,'1': 1}function helper(n) {if(n in cache) return cache[n];const res = helper(n-1) + helper(n-2);cache[n] = res;return res;}return helper(n);}console.log(fib1(8));
迭代方法:
思想:
此方法的思路是将每一项计算出来的f(n)存入数组,使用迭代的方法,每一次迭代完成,数组中就多了一项元素。
此处存疑?
上面说到,迭代是循环中参与计算的变量就是要返回的变量,而我的代码这里参与计算的是数组,返回的却是数组的第n项,不知道这个算不算是正宗的迭代。
代码:
// 迭代:O(n)function fib2(n) {let arr = [0, 1];for (let i = 2; i<=n; i++) {arr.push(arr[i-1] + arr[i-2]);}return arr[n];}console.log(fib2(8));
迭代方法优化:
思想:
上一段代码中,随着n的值的增大,数组会无限变长,而我们知道斐波那契数列是无穷的,所以当n值很大时,就对空间浪费巨大。反正计算新的值时也就只会用到它的前两个值,每一次从末尾推入一个新元素,就同时从开头删去一个元素,让数组的长度始终只用保存两个元素,大大减少了空间的使用。
代码:
// 优化迭代--保持数组长度总是为2,节约空间function fib3(n) {let arr = [0, 1];if(n == 0) return 0;if(n == 1) return 1;for (let i = 2; i<=n; i++) {// 分成两步实现/* // 将0号元素从数组删除let one = arr.shift();// 添加新的元素arr.push(one + arr[0]); */// 一步实现arr.push(arr.shift() + arr[0]);}return arr[1];}console.log(fib3(0));
小结
不知道干什么的时候就学习,不管是往哪个方向学,学习总是没错的。
学习递归与迭代参考的博客是http://blog.csdn.net/daijin888888/article/details/70157153
学习斐波那契数列第n项值的算法是参考了B站视频https://www.bilibili.com/video/BV1aE41147Ly
递归与迭代 | 求斐波那契数列第n项值的四种算法相关推荐
- linux求斐波那契数列前10项,linux求斐波那契数列的前10项以及总和.
C语言的函数问题求斐波那契前四十个数,斐波那契数列指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学 />#include//the nest function used t ...
- 求斐波那契数列前n项的值
Description 输入n,求斐波那契数列前n项的值.斐波那契数列规律如下:1, 1, 2, 3, 5, 8, 13,21, 34,55-,从第三项开始,每一项都是前面两项的和. Input 输入 ...
- 迭代求斐波那契数列python_python中的迭代器(以斐波那契数列为主讲解)
简要引入: 迭代一词,我们再熟悉不过了,它经常出现在算法中,在数学中也有很多的使用,比如一个算法经过多少次的迭代,执行的效率有了很大的提高-- 迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过 ...
- matlab求斐波那契数列第n项的值,求fibonacci数列第n项的值. 1 1 2 3 5 8....n ?
[C语言]用递归算法编写一个程序求Fibonacci数列的第n项值 #includeunsignedintFibonacci(intn);intmain(void){inti;for(i=1;i vb ...
- C语言——递归函数(求斐波那契数列第n项的值)
递归函数是指在一个函数中直接或者间接调用函数本身. 例如,设一个无返回值函数为fun,同时,设置一个整形形参变量为a void fun(int a) {if(a>0){fun(a-1);pr ...
- 用函数求斐波那契数列前n项和
#include <stdio.h> long fibonacci(int n) { long num; if (n == 1 || n == 2) { n ...
- 利用递归、迭代解决斐波那契数列问题与汉诺塔难题
有人说,"普通程序员使用迭代,天才程序员使用递归",真是这样吗? 1.浅谈递归与迭代 <1>递归的基本概念: 程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个 ...
- 函数(递归,迭代实现斐波那契数列)
上篇文章介绍了一下函数的基本内容,这次来讲讲函数的编程技巧--递归,迭代.并运用这两个技巧实现的斐波那契数列. 递 归 递归是一个过程或函数在其定义或说明中直接或间接调用自身的一种方法,把一个复杂的问 ...
- python递归求斐波那契数列前20项_Python 求斐波那契数列前20项和
展开全部 定义:斐波那契数列2113(Fibonacci sequence),又称黄金分割数列,指的是5261这样一个数列:0.41021.1.2.3.5.8.13.21.34.--在数学上1653, ...
最新文章
- C# 的关键字系列 (3 of n)
- LeetCode Maximum Product of Word Lengths(位操作)
- 爱奇艺称告别唯流量时代 正式关闭显示前台播放量
- LongAdder解析 1
- ElementUI中的el-select中多选回显数据后没法重新选择和更改
- boost::python::ndarray相关的测试程序
- Nginx server_name通配符匹配配置
- andriod的apk文件相关的编译反编译工具
- 搭建php docker环境日记
- VS2010怎样显示行号
- python语言的记事本在哪_用python语言编写一个简单记事本
- 【设计模式】迭代器模式
- java call.invoke_java invoke 以及 webservice详解,求助
- 教师专用录微课及剪辑软件推荐-camtasia及使用教程
- 重庆市中职计算机一级考试,重庆市计算机一级考试题库答案
- JAVA前后端分离项目实战
- 结构体数组 初始化(转)
- 神经元的结构示意图手绘,神经元的结构图手绘
- VMware虚拟磁盘VMDK格式说明书1.1---3 The Descriptor File描述文件
- Python一行代码实现正三角形
热门文章
- 一个Java对象有多大(Object \int[])
- vue项目 乐橙云(imouplayer.js)--轻应用直播SDK demo案例(保姆级)
- 云业CMS开源企业建站系统v2.1.6源码
- linux 高速下载工具 aria2 的用法
- nexus 5x安装xposed
- 模切刀模的日常维护有哪些呢?
- 神经网络激活函数汇总(Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout)
- 人工智能-数学基础-假设检验
- 音频和视频信息在计算机内的表示形式是什么,声音与视频信息在计算机内的表现形式是什么...
- png文件头_Android 史上最优雅的实现文件上传、下载及进度的监听