递归
- 基线条件:函数不再调用的条件
- 递归条件:函数调用的条件
def factorial(num):
if num <= 1: #基线条件
return 1
else: #调用条件
return num*factorial(num-1)
如果使用循环,程序的性能可能更高;如果使用递归,程序可能 更容易理解。如何选择要看什么对你来说更重要。
调用栈
两种操作:压入-弹出
程序在执行过程中利用栈来保存程序执行的进度。比如:
def greet(name):
greet2(name)
print("how are you.")
bye()
- 调用函数
greet("lucy")
,计算机会先分配一块内存空间,将函数信息存储在内存中; - 执行下一步代码
- 执行
greet2("lucy")
,计算机在原有的基础上新分配一块内存空间
调用完成后取走
现在,栈顶的内存块是函数greet的,这意味着你返回到了函数greet。当你调用函数greet2 时,函数greet只执行了一部分。这是本节的一个重要概念:**调用另一个函数时,当前函数暂停 并处于未完成状态。**该函数的所有变量的值都还在内存中。执行完函数greet2后,你回到函数 greet,并从离开的地方开始接着往下执行。
小结
递归指的是调用自己的函数。
每个递归函数都有两个条件:基线条件和递归条件。
栈有两种操作:压入和弹出。
所有函数调用都进入调用栈。
调用栈可能很长,这将占用大量的内存。溢出
练习题
编写一个求最大值的函数
def max(alist):
if len(alist) == 0:
return
elif len(alist) == 1:
return alist[0]
elif len(alist) == 2:
renturn alist[0] if alist[0]>alist[1] else alist[1]
else:
max_i = max(alist[1:])
return alist[0] if alist[0]>max_i else max_i