关于递归的思考
admin
2023-07-31 01:47:55
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用数学公式表示应该是这样:

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

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

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

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

哇,原来如此!

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...