导入
什么是递归?
举个例子:从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的是……
他们有个同样的特点,都在故事中重复出现了同样的“故事”,这就是递归的核心理念。
我们知道,函数是可以调用函数的,作为特例,如果函数调用了自身这就是递归。
递归的官方定义:
程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
def f(x):
if x > 0 :
# 判断语句,如果x > 0就继续调用自己,否则就直接返回0
return x + f(x-1)
else:
return 0
print(f(3))
# f(3)=3+f(2)
#
# =3+2+f(1)
#
# =3+2+1+d(0)
#
# =6
这里还可以用来解决高斯小学数学问题。高斯读小学的时候,有一次,老师出了一道难题,要他们从1加起,加2,加3,加4,....一向加到100,满以为这下准能把学生们难住。没想到高斯一会儿就算了出来。老师一看,答数是5050,一点不错,大吃一惊。高斯是这样算的:1与100、2与99、3与9.…….每一对的和都是101,而100以内这样的数共有50对,101×50=5050,他的这种计算方法,代数上称为等差级数求和公式。而在计算机语言中,我们可以用递归来解决,只需要将3改为100:
def d(x):
if x > 0 :
return x + f(x-1)
print(f(100))
小结:
- 递归:函数自己调用自己
- 只递不归会导致程序崩溃(在程序运行时,调用函数会占用一片叫做栈(stack)的内存空间,当函数运行结束时会从中取出。但如果只调用不结束,栈空间会被塞满,数据无法存储,会出现“栈溢出”错误,对程序运行而言这是致命的错误)
- 要在适当的时候终止递归(为了避免崩溃,递归函数中一定要包含条件语句)
递归不是纯粹的循环和复读,递归肯定要给个出口的,或者说是质变的机会,一味的复读下去那是死循环。简单来说,递归是为了获取最外层,要从他下一层入手,下一层再从下一层入手,但循环进去后,保证有个最底层能反馈出上一层,而上一层得到反馈再向上反馈,所以是循环进入,触底反馈,再循环出来。