• 函数和常用模块【day04】:递归(五)


    本节内容

    1. 作用域、局部和全局变量
    2. 递归
    3. 函数式编程
    4. 高阶函数和eval()函数

    一、概述

    在函数内部,可以调用其他函数。但是一个函数在内部调用自身,这个函数被称为递归函数。

    二、简单介绍

    那递归具体是怎么实现的呐?下面我们就来看看如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def calc(n):
        print(n)
        if int(n/2== 0:  #结束符
            return n
        return calc(int(n/2))  #调用函数自身
     
    = calc(10)
    print('----->',m)
     
    #输出结果
    10
    5
    2
    1
    -----1 #最后返回的值

    看到这边,有限小伙伴有些蒙圈,好吧,下面我用一个图,来解释一下吧!请看图:

    根据代码,最后一层,一定需要一个结束符,来结束。

    我们再来举一个经常用到的例子,1+2+3+4+.....+100的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def add_to_100(n):
        if == 0:
            return n
        return + add_to_100(n-1)
     
    = add_to_100(100)
    print(n)
     
    #输出
    5050

     这个例子告诉我们,add_to_100(n-1)返回的是n-1+add_to_100(n-2)......这个就是递归的奥秘之处。

    三、递归特性总结

    1. 必须要有一个明确的结束条件。
    2. 每次进入更深一层的递归时,问题规模相比上次递归都应该少(问题规模:比如你第1次传进的是10,第2次递归应该是9...依次越来越少,不能越来越多)。
    3. 递归的效率不高,递归层次过多会导致内存溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈贞,每当函数返回,栈就会减一层栈贞。由于栈的大小不是无限的,所以递归的次数过多,会导致栈溢出)。

    第3点关于这个内存溢出说明:栈不是无限的,它是有限的,过多会导致内存溢出。如图:

  • 相关阅读:
    二叉搜索树
    splay模板
    树状数组模板
    K尾相等数
    寻找最大数
    布线问题(最小生成树)
    开心的小明
    独木舟上的旅行(二)
    The Triangle(记忆化搜索)
    喷水装置(二)
  • 原文地址:https://www.cnblogs.com/luoahong/p/9889488.html
Copyright © 2020-2023  润新知