美文网首页
关于递归的思考

关于递归的思考

作者: pylego | 来源:发表于2016-07-21 21:21 被阅读0次

关于递归的思考

之前有接触过递归,看到别人写的递归函数的代码,好生羡慕,怎么就能写这么好呢?我怎么就想不到这样写呢?如此等等。

就拿fibonacci函数来说吧,一个普通的函数可能这样写:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

我看到这个函数的思考方式是这样的:

1. 当n=0时:返回0
2. 当n=1时:返回1
3. 当n=2时:
    1. 首先去调用n=1,返回1
    2. 再去调用n=0,返回0
    3. 把0和1相加返回1
4. 当n=3时:
    1. 调用n=2
        1. 调用n=1,返回1
        2. 调用n=0,返回0
        3. 相加返回1
    2. 调用n=1,返回1
    3. 把1和1相加返回2
5. 等等

想到这我头都要爆了,彻底被人家的函数折服了,看来我是写不成这么好的函数了。

但我转念一想,这个函数的本质是fibnacci序列,我何不回归fibonacci本身呢?fibonacci用数学公式表示应该是这样:

2016-07-07-thinking-in-recursion-formula-of-fibonacci.png

看到公式我恍然大悟,上面那个函数不就是根据这个公式直接翻译的嘛!原来我一直思考都是顺着函数的代码思考,这样肯定会觉得很难,
正确的思考方式应该是从算法出发然后再写代码。

经过了上面的惨痛教训看看我能不能写出正确的fibonacci序列函数,分段函数的公式应该是这样的:

2016-07-07-thinking-in-recursion-formula-of-fibonacci-sequence.png

那么直接写成代码就应该是这样的:

def fib_seq(n):
    seq = []
    if n == 0:
        seq.append(0)
    else:
        seq.extend(fib_seq(n-1))
        seq.append(fib(n))
    return seq

咦,这两个append好像可以合并:

def fib_seq(n):
    seq = []
    if n > 0:
        seq.extend(fib_seq(n-1))
    seq.append(fib(n))
    return seq

哇,原来如此!

相关文章

  • 关于递归的思考

    关于递归的思考 之前有接触过递归,看到别人写的递归函数的代码,好生羡慕,怎么就能写这么好呢?我怎么就想不到这样写呢...

  • 递归的思考

    JS 从斐波那契数列浅谈递归 一、前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听...

  • 关于递归

    设计递归算法可以分为以下几个步骤 1.思考递归算法的循环过程。为什么需要递归,每次递归会产生什么结果?递归次数怎么...

  • 数据结构与算法第六讲 - 递归

    本讲内容 递归的定义递归的特性递归的写法递归的应用 思考题:推荐注册返佣金某app,用户 A 推荐用户 B 来注册...

  • 关于递归算法的一些思考

    递归算法是编程时被经常应用的算法。本人并非编程专业人员,只是为了搞懂拜占庭将军问题查找资料时,偶然间得知这种算法的...

  • 关于递归算法的一点思考

    我们都知道在计算机领域中好的算法代表了:0.省时间1.省空间(RAM,而非Disk) 递归分为两种:线性递归 和 ...

  • 【Scala】尾递归优化

    以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么。在函数式编程中,随处可见递归思想的运用。下面给出几个递归...

  • Markdown写代码

    [导读] 今天本来的计划是写关于python递归的思考的,写着写着发现对于markdown写代码的代码太不熟悉了。...

  • go递归

    1.递归的使用 使用递归快速排序 2.关于递归上下文的测试 运行的结果如下:

  • 关于递归

    递归:方法自己调用自己

网友评论

      本文标题:关于递归的思考

      本文链接:https://www.haomeiwen.com/subject/wkobjttx.html