代码改变世界

python基础练习题(斐波那契数列)

2021-05-18 23:29  第二个卿老师  阅读(672)  评论(0)    收藏  举报

day4

---------------------------------------------------------------

实例006:斐波那契数列

题目 斐波那契数列。

题目没说清楚,大概说的是输出制定长度的数列吧,想了想实现如下:

 1 a = int(input("请输入斐波那契数列位数:"))
 2 list = []
 3 for i in range(a):
 4     if i <2:
 5         list.append(i)
 6     else:
 7         list.append(list[i-2]+list[i-1])
 8         if len(list)==a:
 9             print(list)
10             break

看了代码量也还行,下面看看标准答案:

1 def Fib(n):
2     Fibona = [0,1]
3     if n>1:
4         [Fibona.append(Fibona[i-1]+Fibona[i-2]) for i in range(2,n)]
5     return Fibona
6 n = int(input("请输入需要的斐波那契数列长度n:"))
7 print(Fib(n)[0:n])

标准答案用了列表推导式,确实比我的好理解,代码也精简。。。,再来一个经典的:

1 fibs = [0,1]
2 num = int(input("请输入需要的斐波那契数列长度: "))
3 for i in range(num-2):
4     fibs.append(fibs[-2]+fibs[-1])
5 print(fibs)

很惊艳,很巧妙吧,最后看看递归的:

 1 def recur_fibo(n):
 2     if n <= 1:
 3         return n
 4     else:
 5         return (recur_fibo(n - 1) + recur_fibo(n - 2))
 6 nterms = int(input("您要输出几项? "))
 7 list = []
 8 for i in range(nterms):
 9     list.append(recur_fibo(i))
10 print(list)

从网上的资料来看,递归的性能比不上循环的,但是看起来很方便,递归一般存在以下特点(python的递归最大深度是1000):

1、必须有一个明确的结束条件
2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)