Grokking algorithms(第三章)Recursion

递归使用场景:箱子1上锁了,钥匙在箱子2中,但是箱子2中也有一堆小箱子,钥匙在其中的小箱子中。

def look_for_key(box):
    for item in box:
        if item.is_a_box():
            look_for_key(item) Recursion!
        elif item.is_a_key():
            print “found the key!”

这段代码的意思是,首先把箱子2输入进函数。for item in box,这条命令是遍历箱子2中所有的小箱子。假如小箱子里还有更小的箱子,那么继续遍历,直到找到钥匙。

另外,使用递归,需要注意的是:要如下面代码一样,有两条分支,一条是递归分支,一条是跳出递归分支,不适用的话会造成死循环

def countdown(i):
    print i
    if i <= 0: Base case
        return
    else: Recursive case
        countdown(i-1)

call stack

有两种状态,如下图所示:

1.在list开头放入一个新元素

2.在list开头弹出一个新元素,并读取它 

举一个例子,如下图所示,你能从这幅图中得出什么信息

The call stack with recursion


参考如下阶乘代码

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1)

下图为阶乘代码在call stack中的图解 

 

 

从图中可以看到,阶乘的过程是首先把函数调用堆起来,如下图所示

其实这个时候,一次计算也没有发生,然后,接下来从最上方开始,依次计算 ,分别调用。

递归的特点:耗费内存空间,但是容易阅读,递归太多次,内存不够,会出现 stackoverflow error错误。

循环的特点:不耗费空间,但是不容易阅读

本章小结

All function calls go onto the call stack的意思就是说,每一个函数调用,都会叠加在call stack上面,上面有个阶乘的图,就是这种情况

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值