day3-递归

一、概述

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

二、简单介绍

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

def calc(n):
    print(n)
    if int(n/2) == 0:  #结束符
        return n
    return calc(int(n/2))  #调用函数自身

m = calc(10)
print('----->',m)

#输出结果
10
5
2
1
-----> 1 #最后返回的值

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

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

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

def add_to_100(n):
    if n == 0:
        return n
    return n + add_to_100(n-1)

n = 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点关于这个内存溢出说明:栈不是无限的,它是有限的,过多会导致内存溢出。如图:

 

posted @ 2017-03-06 18:56  帅丶高高  阅读(257)  评论(0编辑  收藏  举报