Python学习笔记1——斐波那契数列
这是一个高中同学问我的问题,本来是用C来写的,正好正在学Python,就用Python重写了一遍当作练习。
下面是题目要求:
一道很简单的题目,但有些细节还是要注意的,我第一次写的代码在细节上就不是很完美。
首先来看看什么是Fibonacci数列。
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
以上说明来自百度百科,不难看出,Fibonacci其实就是由前两项计算第三项的数列。为了求第n项Fibonacci数列的项,自然而然想到了递归。以下是求第n项Fibonacci的函数。
1deffib(n):
2ifn==1orn==2:
3return1
4else:
5returnfib(n-1)+fib(n-2)
写C写习惯了,有些地方容易错,比如冒号。
这个函数很好理解,不作过多说明。
我们再来看第二个要求,最简单的想法就是一个一个求,直到所求的数比上限大为止。我用的就是这种办法,因为Fibonacci数列增长的特别快,所以一般不用求多少项(100项以内)就能得出答案。下面是我最一开始写的代码:
1defPrintFN(m, n):
2i=1
3j=
4whilefib(i)
5i = i+1
6whilefib(i)
7ifj!=0:
8print""
9printfib(i)
10j = j+1
11i = i+1
12ifj==0 :
13print"No Fibonacci number!"
一开始用了自增符号,发现报错,才知道Python里没有自增符号,具体原因以后我会专门写一篇比较C和Python的文章进行详述。
然而,这段代码测试没有通过,当上限刚好是Fibonacci数时,会少输出上限,所以在第二个while的条件里加了个等号,还有一点,当上下限都是1的时候,由于数列的第一项和第二项都是1,所以1会输出两次。经过一番修改,最终的代码如下:
1deffib(n):
2ifn==1orn==2:
3return1
4else:
5returnfib(n-1)+fib(n-2)
6
7defPrintFN(m, n):
8i=1
9j=
10whilefib(i)
11i = i+1
12whilefib(i)
13ifj!=0:
14print"",
15printfib(i),
16j = j+1
17i = i+1
18ifi==2:
19i = i+1
20ifj==0 :
21print"No Fibonacci number",
22
23m = input("m=")
24n = input("n=")
25t = input("t=")
26print("fib(%d) = %d n"%(t, fib(t)))
27PrintFN(m, n)
由于我用的python2.7,只能在ptint后加逗号来不让它换行,但这样就不能完全符合题目要求了,因为加逗号后会有个空格。这部分暂时没办法修改,不过大体功能已经实现了!
最后,让我们总结一下这个程序用了Python的哪些知识点:
变量
输入与输出,格式化输出
运算
函数
流程控制:判断、循环
这一次到这为止,第一次写这类博文(以前可是知名情感博主),希望自己能坚持下去!
- Dubbo 源码解析 —— Zookeeper 创建节点
- 熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker
- 源码级别解读 mybatis 插件
- 在WebKit中并行加载外部脚本译:
- 100行代码,搞定http监控框架
- 【腾讯反病毒实验室】深度剖析APT28最新作品
- [译]clearfix改良及overflow:hidden详解
- 深入解析CSS样式层叠权重值
- [译]CSS边框实现“无图化”设计
- 自适应的多列图文混排改进
- [译]Laravel 5.0 之运行环境及环境变量
- 90行代码,搞定日志监控框架
- Laravel Migrate 中的 Fresh 和 Refresh 命令
- 框架组件,究竟要不要自研?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Android中查看当前Activity是否销毁的操作
- Android 7.0 运行时权限弹窗问题的解决
- Android加密之全盘加密详解
- Android 实现彻底退出自己APP 并杀掉所有相关的进程
- 使用Android开发接入第三方原生SDK实现微信登录
- Android打包篇:Android Studio将代码打包成jar包教程
- Android系统制作自定义签名的例子
- 抖音短视频系统开发,日期加减
- Android开发之InetAddress基础入门简介与源码实例
- Android实现通讯录功能
- 教你用CentOS7下使用mktorrent制作PT种子
- 让 Python 的高阶函数支持链式调用[实用库/轮子]
- 解决了一个 Python Type Hints 的问题,分享一下
- Elasticsearch:flattened 数据类型 (7.3 发行版新功能)
- Android开发准确获取手机IP地址的两种方式