听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥。

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

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

一、非递归方式求阶乘

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

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

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

def factorial(n):
"""
n 就是要求的阶乘的数字
"""
result = n
for i in range(1, n):
result *= i return result if __name__ == '__main__':
print(factorial(10))

二、递归方式求阶乘

1. 什么是递归?

相信大家一定都听过这么一个故事:

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

其实这种就是递归,说白了,就是自己去引用自己。

那么,递归用在函数中,就可以是这样的:

def factorial():
factorial() if __name__ == '__main__':
factorial()

在调用函数factorial的时候 在函数中又继续调用factorial,跟上面的故事一样,就可以无穷无尽的递归下去,

直到讲故事的老和尚累晕,以及电脑的内存溢出宕机。

但是,重要的一点,递归只是解决问题的一种方式而已,比如上面的求阶乘,我用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))

三、总结

  • 递归:只是解决问题的一种方式,不一定非要用
  • 递归式函数:就是函数自己调用自己
  • 递归的2个条件:基线条件(满足则不再递归)、递归条件(满足则基线递归)
  • 递归跟循环类似:基本可以互相替代
  • 循环编写起来比较容易,阅读起来比较难。递归编写起来比较难,但是阅读容易

最新文章

  1. ffmpeg编译常规大全
  2. 业务对象和BAPI
  3. jquery: 一些常见的获取
  4. jQuery实现图片轮播
  5. ServletContextListener 启动SPRING加载数据到缓存的应用
  6. Netty 5用户指南
  7. ubuntu无法解析主机错误与解决的方法
  8. 配置phonegap Android开发环境
  9. python编码问题之\"encode\"&\"decode\"
  10. freemarker报错之一
  11. SSRS报表服务随笔(rdl报表服务)-报表结构与样式
  12. 20170905工作日记--listview优化大全
  13. react native环境搭建(含错误处理)
  14. Timer triggered DMA transfer - Delay between requesting the DMA transfer
  15. webservice(草稿)
  16. teamviwer安装提示 Verification of your Teamviewer version failed!.
  17. Quick-Cocos2dx-Community_3.6.3_Release 中 tolua++ 使用方法
  18. Spring MVC自动为对象注入枚举数据
  19. Unity C# 使用JsonUtility读写Json文件
  20. STL之pair类型具体分析

热门文章

  1. linux 系统磁盘管理(主分区和逻辑分区)
  2. 给jekyll博客添加搜索功能
  3. 设计模式(一)——Java单例模式(代码+源码分析)
  4. 使用VisualStudio直接运行简单的C#语句
  5. codeforces#244(div.2) C
  6. P4718 [模板]Pollard-Rho算法
  7. poj3757 Training little cats
  8. c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数
  9. Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)
  10. CodeForces - 1250J The Parade 二分