1、我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。 2、一个小朋友坐在第10排,他的作业本被小组长扔到了第1排,小朋友要拿回他的作业本,可以怎么办?他可以拍拍第9排小朋友,说:“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说:“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。 3、 一个洋葱是一个带着一层洋葱皮的洋葱。
我想到一个比较接近我们生活的例子,和那个传本子的例子类似,比如你喜欢一个女孩,你想告诉她,但你和她座位隔得很远,你写好了纸条,想同学传过去,于是,你把纸条传给你前面的同学,然后同学又向前传,直到传到你喜欢的那个女孩手里,但是女孩已经有喜欢的人了,于是,她也写了一个纸条让原来的同学再传回来给你,那么同学之间打招呼传纸条的行为就可以看作是函数调用,你是最初调用的函数,那个你喜欢的女孩就是最终的目的地,纸条上的信息就是初始值和最终答案。

4、最简单的递归的实例

# -*- coding:utf-8-*- # 将10不断除以2,直至商为0,输出这个过程中每次得到的商的值。def recursion(n): v= n//2# 地板除,保留整数print(v)# 每次求商,输出商的值if v==0:''' 当商为0时,停止,返回Done'''return'Done' v= recursion(v)# 递归调用,函数内自己调用自己 recursion(10)# 函数调用
输出结果:

5、递归的特点

通过以上的介绍,我们大致可以总结出递归的以下几个特点:
1、必须有一个明确的结束条件 2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少 3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
关于递归还有两个名词,可以概括递归实现的过程
递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推 回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯

二、递归经典案例

1、递归求阶乘

实例如下:
# 1!+2!+3!+4!+5!+...+n!def factorial(n):''' n表示要求的数的阶乘'''if n==1:return n# 阶乘为1的时候,结果为1,返回结果并退出 n = n*factorial(n-1)# n! = n*(n-1)!return n# 返回结果并退出 res = factorial(5)#调用函数,并将返回的结果赋给resprint(res)# 打印结果

2、递归推斐波那契数列

实例如下:
# 1,1,2,3,5,8,13,21,34,55,试判断数列第十五个数是哪个?def fabonacci(n):''' n为斐波那契数列'''if n