《算法图解》系列笔记(三)—— 递归

递归方法
  1. 递归概念的示例
    文中是通过在盒子堆中找钥匙的示例,来说明递归这一概念的,其流程图如下:
Created with Raphaël 2.1.2 开始 详细检查盒子的每样东西 是否是钥匙? 找到钥匙 结束 yes no
  1. 基线条件和递归条件
    每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
def countdown(i):           
    print(i)    
    if i <= 0: #基线条件
        return
    else:      #递归条件
        countdown(i-1)
  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值