四、递归

118 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路​。

 递归要比迭代优秀很多。常用场景有汉诺塔、树结构操作、歇尔宾斯基三角形等。递归是非常消耗时间和空间的。

在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')