随笔 20190801 Python解题记录第6题
许灼灼 记录于20190801
题目来源:菜鸟教程
题目序号:6
题目描述:斐波那契数列。
什么是斐波那契数列?
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34…..
在数学上,费波那契数列是以递归的方法来定义
F0 = 0 (n=0)
F1 = 1 (n=1)
Fn = F[n-1]+ F[n-2](n=>2)
【解析解答】
一般来说,围绕斐波那契数列有两个相关的问题
1是输出n个斐波那契数列的值
2是输出第n个序列的值
首先,我们来讲第一个问题,就是把题目具体化,请输入n值,输出n个斐波那契数列的值
根据上面数学的描述,将其转换为程序代码,采用for循环依次计算,依次输出即可
代码如下所示:
n=int(input("请输入n的值:")) # 输入n值
f0=1 # 第一个值
f1=1 # 第二个值
print(f0,end=",") # 输出第一个值
print(f1,end=",") # 输出第二个值
for i in range(3,n+1): # 循环
f2=f0+f1 # 计算前两个值之和
print(f2,end=",") # 输出
f0=f1 # 把第二个值赋值给第一个值
f1=f2 # 把第三个值赋值给第二个值
运行结果:
请输入n的值:9
1,1,2,3,5,8,13,21,34,
其次,我们来讲第二个问题:输入n值,计算斐波那契数列中第n的那个值
在这里,它不关心前面n-1所对应的值是多少,只需要知道第n个值,根据斐波那契数列的定义
F[n] = F[n-1]+ F[n-2]
F[n-1] = F[n-2]+ F[n-3]
F[n-2] = F[n-3]+ F[n-4]
F[n-3] = F[n-4]+ F[n-5]
当n-m=0或1的时候,我们就能知道等号右边的结果,从而就能知道等号左边的值,再往上,从而得到结果,这便是递归函数的过程
递归,递归,就是递过去,归回来,递过去一个问题,归回来一个问题,再递过去一个问题,归回来一个问题,直到归回来一个答案为止,再逆推着反复一遍即可
在这里,我们就可以采用递归函数来解决这个问题
代码如下所示:
def fib(n): # 定义递归函数fib,参数为N
if n==1 or n==2: # 如果传过来的n值是1或者2,则返回1
return 1
return fib(n - 1) + fib(n-2) # 否则返回前两个数之和
n=int(input("请输入n的值:")) # 输入n值
print("斐波那契数列中第{}个的值是:{}".format(n,fib(n))) #输出结果
注意:当计算量变得很大的时候,不建议用递归函数,因为每次递归都会在内存中开辟一个位置,很耗内存,空间换时间嘛
最后,如果既需要输出斐波那契数列,又需要知道第几个数是多少,可以将数列保存到列表中,代码如下所示:
xlist=[] # 定义列表
for i in range(0,20): # 循环
if i==0 or i==1: # 如果为0或者1,则添加到列表中
xlist.append(1)
else: # 否则,则取前两个数之和
xlist.append(int(xlist[i-2])+int(xlist[i-1]))
print(xlist) # 输出列表
print(xlist[10]) # 输出列表中的某个数
【题目拓展】
对于递归函数的运用,可以多多练习题目来进行提升
题目举例:国王与数学家阿基米德下棋,在棋盘上放米.
第一个格子放一粒米,第二个格子放二粒米,第三个格子放四粒米,第四个格子放十六粒米.按这个方法摆满棋盘,请问在第18格格子中应放多少米
小王看一本书第一天看了20页,以后每天都比前一天多看2页,第30看了78 页正好看完。这本书共有( )页
在数列4,9,16,25,36,……中,第79个数是多少?
等差数列2,6,10,14…..求第98项是多少?
求等差数列46,52,58,……,172共有( )项?
【写在最后】
斐波那契数列可以锻炼学生熟悉递归函数
解决本题,需要学生理解题意,并尝试在纸上逐步罗列,并具有将数学公式转为程序的能力。需要学生有for结构,if结构,以及列表的基础知识
多加练习后面的习题,有助于学生熟练掌握递归函数
【展示下一题】
题目序号:7
题目描述:将一个列表的数据复制到另一个列表中。