函数的调用
函数在编程语言中就是一种具有一定功能,可以重复被调用的代码块。
在python中函数使用def来定义声明函数,格式如下
# func是函数名,可以自定义函数名
def func():
函数中的代码
# 调用函数,执行函数中的代码
func()
函数的相互调用
函数的相互调用其实就是字面意思,就是一个函数的内部调用了另一个函数,仅此而已。
不过需要注意的是函数在相互调用的过程中有可能会出现的情况是循环调用,会导致程序陷入死循环,导致内存溢出,程序崩溃。所以在设计程序代码结构时必须要避免循环调用的情况发生。
函数相互调用简单举例
# 函数相互调用距离
def func1():
"""文档注释:函数1"""
func2() # 调用函数func2
print("这里是函数func1,调用函数func2")
def func2():
"""文档注释:函数2"""
print("这里是函数func2")
# 调用执行函数1
func1()
函数循环调用简单举例
# 函数相互调用距离
def func1():
"""文档注释:函数1"""
func2() # 调用函数func2
print("这里是函数func1,调用函数func2")
def func2():
"""文档注释:函数2"""
func1() # 调用函数func1
print("这里是函数func2,调用函数func1")
# 调用执行函数1,函数1又调用函数2,函数2调用函数1,一直相互调用,无法结束。
func1()
函数的递归调用
函数递归调用,可以说是一个让我又爱又恨的东西。简单来说函数的递归调用就是我调用我自己;它可以只用几行代码就完成非常复杂的运算,但是如果递归调用太复杂的话,在调用的过程中会消耗大量的内存资源,导致程序运行变慢甚至内存溢出。
一般情况下,计算机的递归次数不可以超过1000次。
使用递归函数的条件
- 必须留出口
- 自己调用自己
常见递归调用的使用场景
其实一般举例递归调用都会用到斐波那契数列,这是一个非常经典的案例。
斐波那契数列主要的表达形式就是从数列的第三项开始,后面的每一项都是前两项的和。即f(n) = f(n-1)+f(n-2)。
通过函数递归实现输出斐波那契数列:
# 数列简单举例:
# 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ....
# 第一个数f(1):1
# 第二个数f(2): 1
# 第三个数f(3): f(2)+f(1) --> 1 +1
# 第四个数f(4): f(3)+f(2) --> f(2)+f(1) +f(2) --> 1 +1 +1
# 第五个数f(5): f(4)+f(3) --> f(3)+f(2)+ f(2)+f(1) --> f(2)+f(1)+f(2)+ f(2)+f(1)
# 可以发现不管后面任何一个数字都可以回归到最开始的两个数字。
n = int(input("输入数列的长度:"))
# n表示数列长度
lst = [] # 声明空列表用于存储对应位置数列数据
for i in range(1, n+1): # 获取对应位置
def func(num):
if num == 1 or num == 2:
return 1
else:
return func(num-1)+func(num-2)
# 调用斐波那契数列函数
a = func(i)
lst.append(a)
print(lst)