递归概念:(百度了一下,看看就懂了)
用数学代入法来理解就好。
假设我们用递归来算阶乘 f(n)
f = n => n === 1 ? 1 : n * f(n-1)
f 里面用到了 f,怎么理解呢?
很简单,把式子展开即可:
f(6)
=> 6 * f(5)
=> 6 * (5 * f(4))
=> 6 * (5 * (4 * f(3)))
=> 6 * (5 * (4 * (3 * f(2))))
=> 6 * (5 * (4 * (3 * (2 * f(1)))))
=> 6 * (5 * (4 * (3 * (2 * 1))))
=> 6 * (5 * (4 * (3 * 2)))
=> 6 * (5 * (4 * 6))
=> 6 * (5 * 24)
=> 6 * 120
=> 720
看到递归了吗?
先递进,再回归——这就是「递归」。
以上是 SICP 原文(有删改)。
看完可能有点意思了,那看一下典型的题:
使用递归实现:计算某个数的阶乘
def num_1(num1):
if num1 == 1:
return num1
num1 = num1*num_1(num1-1)
return num1
# print(num_1(5))
斐波那契数
def num_2(num2): if num2 <= 2: return 1 return num_2(num2-1)+num_2(num2-2) # print(num_2(9))
# 1.兔子繁殖问题。
# 设有一对新生的兔子,从第4个月开始他们每个月月初都生一对新兔子,
# 新生的兔子从第4个月开始又每个月月初生一对兔子。
# 按此规律,并假定兔子没有死亡,20个月末共有多少对兔子?
def num_4(num4):
if num4 < 4:
return 1
return num_4(num4-1)+num_4(num4-3)
#print(num_4(20))
递归是很消耗堆栈资源的,递归次数太多了肯定会溢出内的。确切地说,是函容数调用本身就会消耗堆栈资源,不过函数调用结束的时候这个函数使用的堆栈空间会被返还,所以问题不大,很少能看到程序栈满的情况。但是递归是个例外,它是一个函数循环调用自身的过程,在递归结束之前,堆栈使用量会一直增长。程序会不会溢出,就看在栈满之前,你的递归函数能否返回····