python中定义函数功能的重要作用:
将复杂的计算过程封装为一个函数存储起来,就可以避免写重复的代码。再次需要该计算的时候只需调用即可。
一,递归方法:
递归方法为:将问题一步步分解,直到得到可以解决的简单问题。
通常涉及直接或间接条用自身:
例如计算列表(1,3,5,7,9,13)中各元素的和。
直接或间接调用sum()函数自身:
python实现如下:
In[1]
def listsum(a):
if len(a) == 1:
return a[0] #如果列表中只有一位元素,则返回a[0]
else:
return a[0] + listsum(a[1:]) #返回第一位元素于剩余其他元素的和
print(listsum([1,3,5,7,9,13]))
Out[2]:
38
斐波那契数列简介:
斐波那契数列是最常见的一道面试题,又称‘兔子数列/黄金分割数列’。
特性一:
任一个数都是前两个数之和。
例如:
因此第一种计算斐波那契数列的方法,即让数字序列的最后两个元素相加,得到新的数字并插入数列结尾。
特性二:
在极限条件下,相邻两个元素的商等于一个常数。即
第一种:
因此我们可以通过设置一个数组。
a = [0,1]
下一个要插入的数据就为“a【-1】+a【-2】”。
a.append(a[-1] + a[-2])
继续循环。循环y次就得到了y个新数字。
最后所得到的斐波那契数列中数字的个数为 n = y + 2 。
可以根据用户想要的斐波那契数字的个数n来定义循环次数y。
y = n - 2
输入【1】:
def fibs1(n): #定义斐波那契函数
a = [0] #声明a为数组
if n <= 0:
print('错误') #n 不能 <= 0
else:
if n > 1:
a = [0,1]
for i in range(n - 2): #执行n-2次循环,即向数组a中新增n-2个斐波那契数字
a.append(a[-2] + a[-1]) #新增数字 = 最后两个数字的和
return a
输入【2】:
fibs1(10)
输出【2】:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
第二种:
提前定义好数组中元素的个数,再依次设定每个值为前两个数的和。
输入【1】:
def fibs2(n): #n为需要的斐波那契数字个数
f = [0] * n #定义包含n个0的数组
if n <= 0:
print('错误') #n 不能 <= 0
else:
if n >= 2:
f[1] =1 #此时f = [0 , 1]
for i in range(2,n):
f[i] = f[i - 1] +f[i-2]
'''f[2] = f[1] + f[0] = 1,此时f = [0,1,1];三个斐波那契数字f[3] = f[2] + f[1] = 2,此时f = [0,1,1,2];四个斐波那契数字......f[n-1] = f[n-2] + f[n-1];n 个斐波那契数字'''
return f
输入【2】:
fibs2(10)
输出【2】:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
两种方法运行时间对比:
输入【1】:
%timeit fibs1(100)
%timeit fibs2(100)
输出【1】:
26.2 µs ± 736 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
30.7 µs ± 301 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)