【python】递归听了N次也没印象,读完这篇你就懂了

听到递归总以为挺高大上的,为何呢?由于对其陌生,那么今天就来一文记住递归究竟是个啥。函数

不过先别急,一块儿来看一个问题:求10的阶乘(10!)。code

求x的阶乘,其实就是从1开始依次乘到x。那么10的阶乘就是 1*2*3*4*5*6*7*8*9*10递归

1、非递归方式求阶乘

假如,咱们在没接触过递归的状况下,如何去解决这样的问题呢?内存

最简单粗暴的方式 直接print(1*2*3*4*5*6*7*8*9*10)出结果就好了,结果是3628800for循环

可是这种方式显然不是咱们想要的,那么能够试试用for循环的方式来解决。循环

def factorial(n):
    """
    n 就是要求的阶乘的数字
    """
    result = n
    for i in range(1, n):
        result *= i

    return result

if __name__ == '__main__':
    print(factorial(10))

2、递归方式求阶乘

1. 什么是递归?

相信你们必定都听过这么一个故事:引用

从前有座山,山里有作庙,庙里有个老和尚在讲故事,讲的什么呢?
  从前有座山,山里有作庙,庙里有个老和尚在讲故事,讲的什么呢?
    从前有座山,山里有作庙,庙里有个老和尚在讲故事,讲的什么呢?
      ...

其实这种就是递归,说白了,就是本身去引用本身。
那么,递归用在函数中,就能够是这样的:总结

def factorial():
    factorial() 

if __name__ == '__main__':
    factorial()

在调用函数factorial的时候 在函数中又继续调用factorial,跟上面的故事同样,就能够无穷无尽的递归下去,
直到讲故事的老和尚累晕,以及电脑的内存溢出宕机。co

可是,重要的一点,递归只是解决问题的一种方式而已,好比上面的求阶乘,我用for循环同样解决。数字

2. 递归解决阶乘

若是要用递归解决上面的阶乘问题,能够再进一步了解下递归的总体思想。

递归的总体思想就是,将一个大问题分解成一个个的小问题,直到问题没有办法再继续分解,因而,再去解决问题。
那么,递归式函数就要知足2个条件:

  • 基线条件:问题能够被分解为的最小问题,当知足基线条件时候,递归再也不进行
  • 递归条件:继续分解问题
    能够用这个思想来尝试用递归的方式解决阶乘的问题。
10! = 10 * 9!   # 10的阶乘其实能够看作是10 * 9的阶乘
9! = 9 * 8!     # 9的阶乘能够看作是9 * 8的阶乘
8! = 8 * 7!
...
2! = 2 * 1!
1! = 1

能够看到,最后分解到1的时候就不可再继续分解了,那么1就是基线条件了。

def factorial(n):
    # 基线条件,当知足时,则再也不递归
    if n == 1:
        return 1

    # 递归条件,当n不等于1时,继续递归
    return n * factorial(n - 1)

if __name__ == '__main__':
    print(factorial(10))

3、总结

  • 递归:只是解决问题的一种方式,不必定非要用
  • 递归式函数:就是函数本身调用本身
  • 递归的2个条件:基线条件(知足则再也不递归)、递归条件(知足则基线递归)
  • 递归跟循环相似:基本能够互相替代
  • 循环编写起来比较容易,阅读起来比较难。递归编写起来比较难,可是阅读容易
相关文章
相关标签/搜索