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)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)