设为首页 收藏本站
查看: 659|回复: 0

[经验分享] Python算法题----玩转fibonacci数列

[复制链接]

尚未签到

发表于 2018-8-9 07:30:51 | 显示全部楼层 |阅读模式
  fibonacci数列是个很常见的面试题,相信大家都见识过,反正我碰见过两次。递归是最容易想到的办法。但是写一个递归,往往面试官并不满意,会追问。这个递归存在什么问题啊。有没有其它办法啊……。办法总比问题多,跳跳大路通帝都。下面就总结一下。把程序写到面试官的心缝里!
  递归法
  这个递归存在的最严重的问题就是重复计算,在代码的递归分支里可以看到函数被递归调用了两次,那么很多函数其实都被重复计算了。最后再来解决这个问题。
def fib01(n):  
    if n == 1 or n == 2:
  
        return n
  
    else:
  
        return fib01(n-1) + fib01(n-2)
  递推法1
  使用一个列表来存储整个fibonnci数列,所求的即为列表的第n项
def fib02(n):  
    if n == 1 or n == 2:
  
        return n
  
    else:
  
        arr = [1, 1, 2]
  
        i = 3
  
        for i in range(3, n+1):
  
            arr.append(arr[i-1] + arr[i-2])
  
        return arr[n]
  递推法2
  声明几个历史变量不断计算数列的值,并且交换变量
def fib03(n):  
    if n == 1 or n == 2:
  
        return n
  
    else:
  
        x = 1
  
        y = 2
  
        for i in range(3, n+1):
  
            fi = x + y
  
            x = y
  
            y = fi
  
        return y
  缓存递归中间结果
  定义一个字典,将递归函数的计算结果存入_fib_cache,每次判断该函数是否在缓存中,在直接返回,不在,计算并放入缓存
_fib_cache = {}  
def fib04(n):
  
    if n in _fib_cache:
  
        return _fib_cache[n]
  
    else:
  
        _fib_cache[n] = n if n <= 2 else fib04(n-1) + fib04(n-2)
  
        return _fib_cache[n]
  有了缓存,生活美好了很多,但是看着有点别扭。孤零零的_fib_cache,弄个装饰器多好,这明显可以有个装饰器的。
  函数装饰器
def memo(f):  
    cache = {}
  

  
    def decorated(*args):
  
        if args in cache:
  
            return cache[args]
  
        else:
  
            cache[args] = f(*args)
  
            return cache[args]
  

  
    return decorated
  有了这个装饰器函数,我们就可以装饰我们的递归函数了
@memo  
def fib01(n):
  
    if n == 1 or n == 2:
  
        return n
  
    else:
  
        return fib01(n-1) + fib01(n-2)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548844-1-1.html 上篇帖子: python列表和字典 下篇帖子: Python装饰器(Decorate)使用图解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表