递归学习笔记

基线条件和递归条件

每个递归函数都有两部分:

  • 递归条件:函数调用自己
  • 基线条件:函数不再调用自己,避免无限循环
    例:倒数函数
def countdown(i):
    print (i)
    if i<=0:
        return
    else:
        countdown(i-1)
 countdown(5)
 >>>5
4
3
2
1
0

调用栈

计算机在内部使用被称为调用栈的栈,下面是一个简单的函数

def greet2(name):
    print("how are you,"+name+"?")
    def bye():
        print("ok bye!")

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")

  1. 计算机将首先为该函数调用分配一块内存
  2. 变量name被设置为"maggie“,存储在内存中
  3. greet2("maggie")调用,为该函数分配一块内存,将"maggie"存入内存,greet2入栈
  4. 打印"how are you,maggie?",从调用函数返回,greet2出栈。
  5. 栈顶又是greet调用另一个函数时,当前函数暂停并处于未完成状态。从greet2之后继续执行
  6. 添加bye内存块,打印"ok bye!"并从这个函数返回
  7. 回到greet,由于没有别的任务了,就从greet返回。
    在这里插入图片描述

递归调用栈

计算阶乘的递归函数:

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

下面分析调用fact(3)时调用栈的变化。
在这里插入图片描述

尽管使用栈很方便,但是代价就是占用了大量的内存。在这种情况下,有两种处理办法:

  • 重新编写代码,转而使用循环
  • 使用尾递归

小结

  • 递归是指调用自己的函数
  • 递归有两个条件:基线条件和递归条件
  • 栈有两种操作:压入和弹出
  • 所有函数调用都进入调用栈
  • 调用栈很长,将占用大量内存
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值