OJOJ:斐波那契数列的实现——递归与非递归实现
2016-04-13 18:58
411 查看
OJ题目在下面,其实最关键的就是求斐波那契数列,在第一瞬间的想法下,我当然选择的是递归的方式,因为最容易想到,而且本来斐波那契数列就是这种递推的方式定义的,所以这也是本能的反应,但是提交之后,OJ评判程序没有通过,给出的提示是超出所给内存的限制了,毫无疑问,这一定是递归函数带来的副作用,反复调用自身函数,占用大量内存,致使内存溢出,所以得不到结果,自然会想到,测试用例是一个刚好使我们的程序崩溃的值,反过来讲,其实老师想要我们用循环的方式来实现斐波那契数列。
递归确实存在诸多的优势:
用递归使蕴含递归关系的复杂结构变得简单,更容易被理解
复杂的递归问题可以变成更简单的子问题,又可变成更简单的问题,并且关系保持不变
当然就像这道OJ题所反映的:
递归的嵌套非常深,反复的调用自身,大量的开销花在函数调用上
其中还包含了大量的重复计算,因此运算速度比循环慢很多
递归的关系用循环来实现,需要使用一些小技巧,所以我应该多多收集这些代码片段,笨鸟先飞
题目内容:
一个斐波那契数列的前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89,对于一个最大项的值不超过n的斐波那契数列,求值为偶数的项的和。
输入格式:
一个正整数n,如100。
输出格式:
值为偶数的项的和,如 2 + 8 + 34 = 44。
输入样例:
100
输出样例:
44
CODE:
递归确实存在诸多的优势:
用递归使蕴含递归关系的复杂结构变得简单,更容易被理解
复杂的递归问题可以变成更简单的子问题,又可变成更简单的问题,并且关系保持不变
当然就像这道OJ题所反映的:
递归的嵌套非常深,反复的调用自身,大量的开销花在函数调用上
其中还包含了大量的重复计算,因此运算速度比循环慢很多
递归的关系用循环来实现,需要使用一些小技巧,所以我应该多多收集这些代码片段,笨鸟先飞
题目内容:
一个斐波那契数列的前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89,对于一个最大项的值不超过n的斐波那契数列,求值为偶数的项的和。
输入格式:
一个正整数n,如100。
输出格式:
值为偶数的项的和,如 2 + 8 + 34 = 44。
输入样例:
100
输出样例:
44
CODE:
n=int(raw_input()) """ 斐波那契数列递归实现函数 """ def fib(n): if n==1: return 1 elif n==2: return 2 else: return fib(n-1)+fib(n-2) sum=0 i=1 while fib(i)<n: if fib(i)%2 == 0: sum+=fib(i) i+=1 print sum
n=int(raw_input()) """ 斐波那契数列非递归实现函数 """ def fib(n): if n==1: return 1 elif n==2: return 2 else: f1=1 f2=2 for i in range(3,n+1): f=f1+f2 f1=f2 f2=f return f sum=0 i=1 while fib(i)<n: if fib(i)%2 == 0: sum+=fib(i) i+=1 print sum
相关文章推荐
- java实现斐波那契数列的3种方法
- java数学归纳法非递归求斐波那契数列的方法
- C++输出斐波那契数列的两种实现方法
- 求斐波那契(Fibonacci)数列通项的七种实现方法
- 斐波那契数列
- 数学公式
- Go语言学习笔记(练习) - 斐波那契数列
- leetcode 虐我篇之(二十一)Climbing Stairs
- 青蛙跳台阶解法 时间复杂度O(n) 空间复杂度O(1)
- 斐波那契数列及相关问题
- 关于斐波那契数列的复杂度最低算法
- 超级台阶
- 矩阵乘法求斐波那契数列
- Tyvj专题 P1337 fibonacci数列
- HDOJ 2044 一只小蜜蜂
- 简单算法之—斐波那契数列
- java编程:三种方法实现斐波那契数列
- 斐波那契数列的算法实现 —— python
- 黑马程序员-递归-斐波那契数列-1到100的和
- JAVA递归--汉诺塔,斐波那契数列等