斐波那契数列

使用递归定义的最常见数学函数是 fibonacci (斐波那契数列),见其 定义

fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(n) = fibonacci(n − 1) + fibonacci(n − 2)

Python代码:

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

fibonacci(5)

调试

将一个大程序分解为较小的函数为调试生成了自然的检查点。如果一个函数不如预期
的运行,有三个可能性需要考虑:

• 该函数获得的实参有些问题,违反先决条件。
• 该函数有些问题,违反后置条件。
• 返回值或者它的使用方法有问题。

PS:
前置条件( precondition):用例在调用某个方法时必须满足的条件。
后置条件(postcondition):实现在方法返回时必须达到的要求。
副作用(side effects):方法可能对对象产生的任何其他变更。

代码:

def factorial (n):
    space = '␣' * (4 * n )
    print ( space , 'factorial ', n )
    if n == 0:
        print ( space , 'returning ␣1')
        return 1
    else:
        recurse = factorial (n-1)
        result = n * recurse
        print ( space , 'returning ', result )
        return result

factorial(5)

效果:

space 是一个空格字符的字符串,用来控制输出的缩进。下面是 factorial(4) 的输出结果:

C:\Users\xxx\Desktop>f.py

␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣ factorial  5
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣ factorial  4
␣␣␣␣␣␣␣␣␣␣␣␣ factorial  3
␣␣␣␣␣␣␣␣ factorial  2
␣␣␣␣ factorial  1
 factorial  0
 returning ␣1
␣␣␣␣ returning  1
␣␣␣␣␣␣␣␣ returning  2
␣␣␣␣␣␣␣␣␣␣␣␣ returning  6
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣ returning  24
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣ returning  120

《像计算机科学家一样思考Python》-递归的更多相关文章

  1. 像计算机科学家一样思考Python(第2版)|百度网盘免费下载|Python新手入门资料

    像计算机科学家一样思考Python(第2版)|百度网盘免费下载 提取码:01ou 内容简介  · · · · · · 本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程.贯穿全书的主 ...

  2. 读《像计算机科学家一样思考python》——笔记

    这本书,完全是入门级的,特别简单,一天多就看完. 目录: 第二章 变量.表达式和语句 第三章: 函数调用 第四章: 案例研究:接口设计 第五章 条件与递归 第六章:有返回值的函数 第七章 迭代 第八章 ...

  3. 像计算机科学家一样思考python-第4章 案例研究:接口设计

    系统环境 ubuntu18 4.1turtle模块 模块一开始导入turtle模块就报错了 Python ( , ::) [GCC ] on linux Type "help", ...

  4. 像计算机科学家一样思考python-第3章 函数

    在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来“调用”这个函数 3.1函数调用 一个函数调用的例子 & ...

  5. 像计算机科学家一样思考python-第1章 程序之道

    1.7调试 程序是很容易出错的.因为某种古怪的原因,程序错误被称为bug,而查捕bug的过程称为调试(debugging). 一个程序中可能出现3种类型的错误:语法错误.运行时错误和语义错误.对它们加 ...

  6. 像计算机科学家一样思考python-第2章 变量、表达式和语句

    感想: 1.程序出现语义错误时,画状态图是一个很好的调试办法.打印出关键变量在不同代码处理后值的变化,就能发现问题的蛛丝马迹. 2.每当学习新语言特性时,都应当在交互模式中进行尝试,并故意犯下错误,看 ...

  7. 《像计算机科学家一样思考Java》—— 读后总结

    本书属于入门级的Java书籍,与其他的向编程思想.核心技术不同的是,这本书不是按部就班的讲解java变成知识,而是随着语言的深入慢慢增加知识点. 这本书以一个语言开发者的角度,深入浅出的讲解了Java ...

  8. 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法

    几天前自己写了个将阿拉伯数字转为中文财务数字的程序.用的递归,不幸的是它是树形递归. 虽然实际过程中不太可能出现金额数字大到让Python递归栈溢出,但是始终是一块心病,这玩意终究在理论上是受限制的. ...

  9. Python递归_打印节点信息

    Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...

随机推荐

  1. 本地项目上传到github 报错“master -> master (non-fast-forward)”

    接下来 第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令,此命令会在当前目录下创建一个.git文件夹. git init 第二步:将项目的所有文件添加到仓库中 git add . 这 ...

  2. Jenkins中配置邮件通知实例演示

    前言:本文通过安装配置Jenkins实现邮件通知,告知一个C# Git Repo的build成功与否 一.预配条件 在windows上安装Jenkins和它推荐安装的Plugins 创建一个@163. ...

  3. Asp: Server.mapPath() 注意事项

    今天下午,在删除一个用户后,竟然发现该用户上传的图片还能正常显示. 郁闷了,怎么会这样? 为了再次验证这个结果,我新注册一个用户名,然后上传3张图片,接着删除这个用户,再查看刚刚上传的3张图片,竟然没 ...

  4. OpenCv练习

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream&g ...

  5. 和我一起使用webpack构建react项目

    第一步:初始化项目并创建package.json文件 第二步:创建webpack.config.js文件,并写入配置. 第三步:安装webpack以及创建es6语法环境,要将html作为模板文件解析的 ...

  6. Python 爬虫入门(四)—— 验证码上篇(主要讲述验证码验证流程,不含破解验证码)

    本篇主要讲述验证码的验证流程,包括如何验证码的实现.如何获取验证码.识别验证码(这篇是人来识别,机器识别放在下篇).发送验证码.同样以一个例子来说明.目标网址 http://icp.alexa.cn/ ...

  7. BAPC2017

    Benelux Algorithm Programming Contest 2017 参考资料: https://blog.csdn.net/sizaif/article/details/798586 ...

  8. Mysql跨表更新

    Mysql跨表更新一直是大家所关心的话题,本文介绍mysql多表 update在实践中几种不同的写法,需要的朋友可以参考下 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Pr ...

  9. 如何解决win7系统无法运行cmd命令提示符

    如何解决win7系统无法运行cmd命令提示符   CMD命令可以帮助我们很快的执行所需要的程序命令,可以查询系统中很多的信息和解决系统很多的故障,对我们来说非常方便,但是最近有用户反馈自己win7电脑 ...

  10. mysql -- 逻辑语句

    1.if语句 delimiter \\ create procedure p1() begin declare i ; then ; elseif i = then ; else ; end if; ...