码迷,mamicode.com
首页 > 编程语言 > 详细

《算法图解》之递归

时间:2018-07-09 11:17:32      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:进入   countdown   条件   3.2   17.   消元   .com   调用函数   尾递归   

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

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 小结

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

《算法图解》之递归

标签:进入   countdown   条件   3.2   17.   消元   .com   调用函数   尾递归   

原文地址:https://www.cnblogs.com/okokabcd/p/9282007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!