OJOJ:斐波那契数列的实现——递归与非递归实现

本文探讨了斐波那契数列的递归与非递归实现方法,通过一道编程题目的解决过程,揭示了递归方法的内存消耗问题,并给出了非递归实现的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       OJ题目在下面,其实最关键的就是求斐波那契数列,在第一瞬间的想法下,我当然选择的是递归的方式,因为最容易想到,而且本来斐波那契数列就是这种递推的方式定义的,所以这也是本能的反应,但是提交之后,OJ评判程序没有通过,给出的提示是超出所给内存的限制了,毫无疑问,这一定是递归函数带来的副作用,反复调用自身函数,占用大量内存,致使内存溢出,所以得不到结果,自然会想到,测试用例是一个刚好使我们的程序崩溃的值,反过来讲,其实老师想要我们用循环的方式来实现斐波那契数列。

    递归确实存在诸多的优势:

  • 用递归使蕴含递归关系的复杂结构变得简单,更容易被理解

  • 复杂的递归问题可以变成更简单的子问题,又可变成更简单的问题,并且关系保持不变

    当然就像这道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


转载于:https://my.oschina.net/fchen24/blog/658654

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值