函数和常用模块【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点关于这个内存溢出说明:栈不是无限的,它是有限的,过多会导致内存溢出。如图:

原文地址:https://www.cnblogs.com/luoahong/p/9889488.html