递归方法
- 递归概念的示例
文中是通过在盒子堆中找钥匙的示例,来说明递归这一概念的,其流程图如下:
- 基线条件和递归条件
每个递归函数都有两部分:基线条件(base case
)和递归条件(recursive case
)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
def countdown(i):
print(i)
if i <= 0: #基线条件
return
else: #递归条件
countdown(i-1)
递归与循环
在找钥匙的案例中,使用循环和递归的方式都能解决问题,递归是让解决方案更清晰,而使用循环的性能更好些。引用大佬在Stack Overflow上的一句话 1:如果使用循环,程序的性能可能更高;如果使用递归,程序可能
更容易理解。如何选择要看什么对你来说更重要。 —— Leigh Caldwell使用
尾递归
可以提升线性递归的性能,如裴波那契数列的尾递归实现:
def fibonacci(int n, int a):
{
#尾递归计算fibonacci
if n < 0 :
return 0
elif n == 0 :
return 1
elif n == 1 :
return a
else :
return fibonacci(n - 1, n * a)
}
栈(Stack)
- 栈是一种数据结构,它的主要操作方式是后进先出。
- 就如堆盒子,你第一个放下的盒子一定是在底部(在栈中的就叫
push(压入)
),最后一个盒子在顶部,当你想找盒子里钥匙的时候,一定是从顶部拿起(在栈中就叫做pop(弹出)
) - Python里面实现栈,是把list包装成一个类,再添加一些方法作为栈的基本操作详见:docs.python.org。