学习递归时,影响到的一个算法问题

当年学习递归,有一个例子是 1,1,2,3,5,8,13.。。。。。这样求第N个数的值。

当时还颇为认同其递归的巧妙。

后来去携程面试,还被问到,心里暗爽,这不是送分吗。俩分钟再小黑板上写出了递归的实现,被瑞亮总给分析了说是个O(n*n)。还觉奇怪,为啥点了下这个

今天温习算法时,看到关于深度搜索和宽度搜索时,想到这个题目,重新思考了下。顿时觉得当时面试时,瑞亮总当时给留了面子。

下边是今天想到的O(N)的实现方法。

int n =7;
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(1);

for(int index = 2;index<n;index++)
{
  list.add(list.get(index-1)+list.get(index-2));
}
System.out.print(list.get(n-1));

时间: 2024-08-02 06:54:30

学习递归时,影响到的一个算法问题的相关文章

关于校验算法的学习(学习以太网时遇到的)

关于校验算法的学习(学习以太网时遇到的)以太网的包头还是数据都会有校验,在FPGA上实现IP核时,用的是CRC校验,然后学习ICMP协议时,也看到一种校验算法,以此学习分析一下背后原理. 一.先看看ICMP的包格式,主要是写ping命令是用到(会有一篇专门将ping的c语言实现),所以只是展示与ping命令背后的ICMP规则. (来自维基) 对于校验的研究暂时不需要理解其他数据的意思,维基对checksum的解释为 Checksum Error checking data, calculated

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

码农-如果当初学习编程时能有人给我这些忠告该多好

在你学习编程之前思考一下你的目标 要知道编程大多时候就是在创造,当你有最终目标感时道路会更加的清晰.如果你的目标是"学习编程"而不是更具体的学习哪种程序及如何让你的生活更好,那么你可能会发现这不过是一次令人沮丧的实践. 我有点惭愧地承认我学习计算机科学的部分动机是为了证明我聪明,及我想干"聪明人"的工作.我也喜欢思考数学和理论(<哥德尔.艾舍尔.巴赫:集异璧之大成 >这本书在我易受影响的年纪进入了我的脑海),编程是一个不错的选择.当然这并不足以使我坚持这

深入浅出排序学习:写给程序员的算法系统开发实践

引言 我们正处在一个知识爆炸的时代,伴随着信息量的剧增和人工智能的蓬勃发展,互联网公司越发具有强烈的个性化.智能化信息展示的需求.而信息展示个性化的典型应用主要包括搜索列表.推荐列表.广告展示等等. 很多人不知道的是,看似简单的个性化信息展示背后,涉及大量的数据.算法以及工程架构技术,这些足以让大部分互联网公司望而却步.究其根本原因,个性化信息展示背后的技术是排序学习问题(Learning to Rank).市面上大部分关于排序学习的文章,要么偏算法.要么偏工程.虽然算法方面有一些系统性的介绍文

由易到难学习递归的精华

下面是收集的一些递归实现的小算法,勤加练习,相信每一个人都能对简单的递归驾驭自如! 从1加到n的一种递归的简洁写法 int AddFrom1ToN_Recursive(int n) { return n<=0 ? 0 : n+AddFrom1ToN_Recursive(n-1); } 求2进制,8进制,16进制的递归写法,原理相同! void go2(int nNum) { if (nNum == 0) return; else { go2(nNum / 2); printf("%d&qu

算法(第四版)学习笔记(二)——初级排序算法

时间复杂度(Time Complexity): 总运算次数表达式中受n的变化影响最大的那一项(不含系数)(注:若算法中语句执行次数为一个常数,则时间复杂度为O(1)) 若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n)). 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n) 算法的基本操作重复执行的次数是模块n的某一个函数f(n) 随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高. 空间复

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

算法学习#02--斐波那契Fibonacci数列算法优化

算法列表 本文从时间效率和占用空间内存角度评估,找出最优算法. 经典递归算法Recursive algorithm(很慢) 动态存储算法Dynamic programming(慢) 矩阵幂算法Matrix exponentiation(快) 倍数公式算法Fast doubling(很快) 倍数公式算法+快速乘法Fast doubling with Karatsuba(最快) Fibonacci数列 1.数列介绍 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂