从零开始学递归
以前在Leetcode上刷sql题目的时候,碰到过许多较难的题目需要使用到递归的方法去构造一个字段,当时对于递归是望而生畏,迟迟不敢下笔研究,只是了解递归在SQL中的写法,对其原理实属陌生。由于学习了经典的递归题目汉诺塔,加之自己查询的许多博主的递归文章,现对递归做一些自己比较浅显的总结。
(本人属于从零开始学数据分析的纯正文科生,若对于递归的理解有任何不当之处,随时指正批评,渴望在批评中成长。)
一、递归的定义以及原理
开场问题:函数内部能自己调用自己吗?
背景知识:无论是C语言、python还是R语言,函数的构造逻辑基本一致,函数由构造函数的关键字、函数名以及被撰写的函数主体构成。在这些要素被定义后,一个函数就被定义成功了。通常我们认为,一个函数只有被定义完成后,才能被调用。往往这个过程是通过在函数外部写出函数的名称从而执行函数主体的代码来实现。但是,函数允许自己在内部调用自己。
1.1 递归的定义
递归定义:函数在自己内部调用自己的过程被称为递归。
通过一个简单的递归运用来解释递归的定义:
递归实现阶乘函数(python)
在上述的fac函数内部,fac()函数以fac(n-1)的形式再次被调用,这就是一个典型的递归。如果将2做参数n的值,那么整体程序的运行逻辑如下:
递归原理(python)
当n=2时,会直接跳到else对应的代码块执行相应语句(因为n!=1),由于return关键词后调用了函数自身,因此会发生递归,这个时候fac(1)会再次执行一次fac()函数函数体内的语句,程序会判断n是否等于1,如果等于1则返回1,否则继续调用函数自身。在此例中,由于参数很小因此在递归一次后(即1级递归),n就满足了fac函数退出的条件,即n==1时会返回1,这个时候递归结束。
1.2 递归的原理
通过上面的例子,基本可以总结出递归的原理和特征:
- 递归可以根据函数被调用的次数而分类成不