本文已参与「新人创作礼」活动,一起开启掘金创作之路。
递归要比迭代优秀很多。常用场景有汉诺塔、树结构操作、歇尔宾斯基三角形等。递归是非常消耗时间和空间的。
在Python中递归的深度默认是1000层左右,用下列命令可以更改递归的深度:
>>> import sys
>>> sys.setrecursionlimit(1000000)
注意,递归需要大量调用自身函数,会带来大量的空间时间开销。
一、用递归求阶乘
写一个求阶乘的函数:正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。例如所给的数是5,则阶乘式是1×2×3×4×5,得到的积是120,所以120就是4的阶乘。
用普通的for循环实现:
def factorial(n):
result = n
for i in range(1,n):
result*=i
return result
print(factorial(5))
递归算法实现:
def factorial(n):
if(n==1):
return 1
else:
return n*factorial(n-1)
print(factorial(5))
二、斐波那切数列递归实现
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
递归和迭代代码实现:
#迭代实现
def Fibonacci(n):
if n <= 0:
return -1
if n == 1 or n == 2:
return 1
n1=1
n2=1
n3=1
while(n-2>0):
n3=n1+n2
n1=n2
n2=n3
n-=1
return n3
#递归实现
def Fibonacci(n):
if n<1:
return -1
elif n==1 or n==2:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
三、汉诺塔问题
def Hanoi(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
Hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上
print(x,'-->',z)#将最底下的最后一个盘子从x移动到z上
Hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
number = int(input('请输入一个整数:'))
Hanoi(number,'x','y','z')