《算法图解》之递归

讲述递归,即调用函数自身的编程方法,递归需要的 基线条件即最简单状态,递归条件即指导函数将条件引向最简状态。由于递归的特殊性,调用栈必不可少,栈为先进后出的数据结构,类似高斯消元法的“向前——向后”,我们将问题逐渐堆高简化,再从高处解决,带入底端,此为调用栈。

1 递归

假设要找一把钥匙,而钥匙在下面的盒子里.

使用一种方法(while循环):

另一种方法(递归):

2 基线条件和递归条件

def countdown(i):
    print(i)
    if i <= 0: # 基线条件
        return
    else: # 递归条件
        countdown(i-1)

countdown(5)

3 栈

3.1 调用栈

def greet(name):
    print('hello, ', name)
    greet2(name)
    print('getting ready to say bye...')
    bye()
    
def greet2(name):
    print('how are you, ', name)

def bye():
    print('ok bye!')
    
greet('maggie')

3.2 递归调用栈

# 使用递归
def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1)

print(fact(3))

# 使用循环
def fact2(x):
    ans = 1
    while (x > 1):
        ans = ans * x
        x = x - 1
	return ans

print(fact2(3))

栈在递归中扮演着重要角色,使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能战胜大量的内存.每个函数调用都要战胜一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息.在这种情况下,有两种选择:

  • 使用循环
  • 使用尾递归

4 小结

  • 递归指的是调用自己的函数
  • 每个递归函数都有两个条件:基线条件和递归条件
  • 栈有两种操作:压入和弹出
  • 所有函数调用都进入调用栈
  • 调用栈可能很长,这将占用大量的内存

转载于:https://my.oschina.net/yysue/blog/1842469

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值