...

『Python整理向』「了解一下到底什么是递归(Recursion)」

最近在学习算法的时候,接触了一个叫递归(Recursion)的东西。
现在开始面向自己整理。
希望我看完之后能搞清楚几个问题。

1. 基本问题Q&A

1-1 递归是什么?

递归就是自身调用自己。

这篇文章写的还不错。
推荐网页 Python 递归函数
这里推荐一个李永乐老师的视频,关于汉诺塔的。下面有。▼▼▼
Youtube需要科学上网才能打开。B站也有,这里自己麻烦手动汉诺塔游戏应该可以找到。

1-2 迭代和递归有什么区别?

共同点: 都是多次重复一个函数
不同点: 递归是自己调用自己,逐渐缩小范围。这个缩小范围就决定了下面的问题的答案,就是必须要有一个出口,每一次递归必须要缩小范围,否则就没意义。
迭代是自己执行了很多次,每次执行都更接近目标值。

比如下面就是关于阶乘n!实现的一组对比。

  # 迭代实现  
  def iterative_of_factorial(n):  
      result = 1  
      for i in range(2,n+1):  
          result *= i  
      return result  
  print(iterative_of_factorial(5))  

  # 递归实现  
  def recursive_of_factorial(n):  
      if n == 1:  
          return 1  
      else:  
          return n * recursive_of_factorial(n-1)  
  print(recursive_of_factorial(5))  

  # 多看几遍可以看出来,递归最后return的是自身。而迭代通过的是不断重复运行下一个函数。  

1-3 递归Code的时候要注意什么

a. 自己调用自己
b. 必须有结束条件作为递归出口,不然死循环了。

2. 实现一个简单递归并解析

从简单的一步步抽丝剥茧开始解析。
因为上面有了简单的阶乘递归,那么我们实现一个加法好了。

def sum_of_recrusive(number):     
    if number == 0:  
        return 0  
    else:  
        return number + sum_of_recrusive(number-1)  

print(sum_of_recrusive(5))  
# result  
# 15  

我们来解析一下上面的方法。
因为打代码看起来不是很具有整体性。我直接把代码截图截下来的,建议整体一起看。

3. 实现稍微复杂的递归

这里主要实现2个函数。斐波那契数列汉诺塔
如何用code写出来呢。我总结了一下规律大概就是这几步吧。

  1. 找规律
  2. 找条件
  3. 查漏补缺(主要是考虑各种极值问题,比如0,1这种特殊情况)

3-1 斐波那契数列

这个数列是很有名的可以用递归来实现的数列。
不懂含义的建议先谷歌一下。

这里分为递归迭代2种方法来对比实现。2种方法一个给的需要几个数列,一个是给了数列范围。别看错。
参考网页: Python Program for Fibonacci numbers

# 递归写法,给列表个数返回列表  

def fibonacci_of_rec(number: int) -> list:  
    """1.递归实现"""  
    if number == 1:  
        return 0  
    elif number == 2:  
        return 1  
    else:  
        return fibonacci_of_rec(number-1) + fibonacci_of_rec(number-2)  

def print_fib(number: int) -> list:  
    """2.打印"""  
    fib_list = []  
    for i in range(1,number+1):  
        fib_list.append(fibonacci_of_rec(i))  
    return fib_list  

print(print_fib(10))  
# resule  
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]  


# 迭代写法,给数字范围返回列表  

def fibonacci_of_iter(n: str) -> list:  
    fib_list = []  
    a, b = 0, 1  
    while a < n:  
        fib_list.append(a)  
        a, b = b, a + b  
    return fib_list   

print(fibonacci_of_iter(1000))  

# result  
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]  

如果你感觉无从下手,那么就要先找规律,规律先找到,再去考虑递归条件的问题。
刚开始不要想着直接写代码,而是现在脑海里思考一下具体的实现步骤。

3-2 汉诺塔

首先要知道汉诺塔是什么,这个就是一个很典型的递归思想。
主要就是通过缩小范围,来进行递归。看代码之前要了解什么是汉诺塔。
参考网页:Python Program for Tower of Hanoi
参考网页:python中的汉诺塔递归算法的具体运算过程是怎样的?

def move(n: int, a: str, b, c):  
    if n == 1:  
        print('move', a, '-->', c)  
    else:  
        move(n-1,a,c,b)  
        move(1,a,b,c)  
        move(n-1,b,a,c)  

move(2,'A','B','C')  
------result-------  
move A --> B  
move A --> C  
move B --> C  

move(3,'A','B','C')  
------result-------  
move A --> C  
move A --> B  
move C --> B  
move A --> C  
move B --> A  
move B --> C  
move A --> C  

4.最后的最后

动手写Code!动手写Code!动手写Code!

书读百遍,其义自见。ー晋·陈寿·三国志
代码也是一样的,我真的写之前看了好多文章都没搞懂,最后真的是自己写一遍又一遍才明白了一点点。所以还是动起手吧。

共有评论(0)

登陆即可评论哦