前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >递归方法的理解

递归方法的理解

原创
作者头像
我爱自然语言处理
修改于 2018-05-28 03:27:45
修改于 2018-05-28 03:27:45
1.1K00
代码可运行
举报
文章被收录于专栏:我的python我的python
运行总次数:0
代码可运行

递归思想算是编程中比较常见但对初学者而言又有些难以理解的方法了。在leetcode上刷了几道题都用递归思想成功解决后觉得应该贯彻互联网的开源共享精神,总结一下自己的爬坑经历了

记得在第一次碰见递归是在学C语言的时候,当时讲解递归这种编程思想用了一个例子:求n!

由于C语言很久不用代码格式已经忘记=_=!因此这里用python重写一遍这个函数:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def f(n):
    if n == 1:
        return 1
    return n * f(n-1)

不得不说这是一个非常简单的例子来讲解递归函数:一个函数在内部调用其自身。这种调用很很巧妙得避免了利用for循环来求解n的阶乘这个问题因此让当时身为初学者的我也能感受到递归函数的强大。

但这个例子看起来容易,但递归实际操作起来却有一定难度。尤其是让自己写一个稍微复杂点的递归时,发现自己逻辑就混乱不清。自己其实也经历过这样一个过程,开始的时候死活无法理解,后来网上搜了搜如何理解递归。在知乎看到两种解释自己十分受用,自己现在能成功解决一个递归问题也是得益于这两种思想:

1.递归其实与数学归纳法有类似之处。数学归纳法是怎么处理问题的呢?首先我们证明在初始情况(一般也是n=1)是成立的,然后假设当n=k时成立,由n=k成立推导出n=k+1时成立。这个过程应该是感到非常熟悉,操作起来也是犹如行云流水了。那么递归呢?非常类似,首先我们要列出相对于数学归纳法里初始情况(n=1)时函数的返回值,这相当于递归函数碰到的特殊情况(求n!时,当n=1可以看做是一种特殊情况)。列出特殊情况后,在写出普遍情况下函数如何执行(也就是n != 1时的情况),这时我们就要推导n = k和n=k-1的关系了,因为我们在执行n=k时需要用到n=k-1时的结果。这时又要用到第二个思想。

2.在写一个递归函数时,可以将递归函数看做一个黑匣子(黑匣子就是我们不管也不知道其中细节,也不理解是怎么实现的,总之就是能实现功能的)。它可以接收一个输入并给出想要的输出,注意,此时要有自信,相信自己写的这个函数可以完成预期的功能。如果这么想,当把n=k-1输入这个函数时,输出的自然就是当n=k-1时我们想要得到的输出,此时我们要相信这个输出是已经解决了n=k-1这种情况的。那么省下的步骤就是在n=k是调用n=k-1时函数输出的结果了,也就是上一个思想中的推导n=k时的输出对n=k-1时的输出的依赖关系了。

上面两种思想:一种是将递归看成数学归纳法的实现过程,另一种是将递归看成一个黑匣子。如果是完成一个递归思想编程任务应该可以完成了。但是这样还是不够的:我们不能总是面对一个自己写的黑匣子吧?

如何搞清楚这个黑匣子的内部结构呢?

建议自己对着一个比较复杂的递归函数(自己当时是花了一个下午的时间看着leetcode上Binary Watch的递归解决方法来理解的),一步一步不嫌麻烦得画出这个函数是如何实现自我调用的,也就是将函数自我调用的栈画出来。就会探知黑匣子内部其实是一环扣一环的关系,就像数学归纳法由一步推出下一步。自己实现一到两次就会对消除的黑匣子的恐惧。

最后自己按照上面的两个思想实现一个递归函数,自己实现了一次后有了信心后面再碰到就得心应手了,理解起来也更加轻松。

:)最后祝大家爬坑愉快

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何更好地理解递归算法?Python实例详解
"递"是传递的意思,"归"是归还的意思,先把一个方法一层层传递下去,然后传递到最后一层再把结果归还回来。
派大星的数据屋
2022/04/03
7600
如何更好地理解递归算法?Python实例详解
拜占庭将军:背后的数学证明
上一讲中拜占庭将军:分布式领域的幽灵,我们介绍了著名的拜占庭将军问题的由来及其结论:
Oilbeater
2020/04/22
1.1K0
Python递归详解
最简单和常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:
全栈程序员站长
2022/07/05
7720
Python递归详解
递归与数学归纳法
递归与数学归纳法(RMI):Recursion and mathematical induction
LeviMaster
2021/09/30
8710
递归与数学归纳法
编码技巧
binarySearch([1, 2, 10, 15, 100], 15) == 3
宇宙之一粟
2020/10/26
4370
纸上谈兵: 数学归纳法, 递归, 栈
数学归纳法 数学归纳法(mathematical induction)是一种数学证明方法,常用于证明命题(命题是对某个现象的描述)在自然数范围内成立。随着现代数学的发展,自然数范围内的证明实际上构成了许多其他领域(比如数学分析)的基础,所以数学归纳法对于整个数学体系至关重要。 数学归纳法本身非常简单。如果我们想要证明某个命题对于自然数n都成立,那么: 第一步 证明命题对于n = 1成立。 第二步 假设命题对于n成立,n为任意自然数,证明在此假设下,命题对于n+1成立。 命题得证 想一下上面的两个步骤。它们实
Vamei
2018/01/18
1.4K0
纸上谈兵: 数学归纳法, 递归, 栈
数据结构基础-递归和循环技巧
递归是从数学领域的数学归纳法借鉴过来的一种技术。递归代码通常比迭代代码更加简洁易懂。当任务能够被相似的子任务定义时,采用递归处理十分有效。二分排序和遍历等问题往往有简洁的递归解决方案。
1025645
2019/02/22
5560
数据结构基础-递归和循环技巧
文心一言 VS 讯飞星火 VS chatgpt (201)-- 算法导论15.2 6题
在Go语言中,证明对n个元素的表达式进行完全括号化恰好需要n-1对括号,可以通过数学归纳法和递归思考来实现。首先,我们可以明确一个基本的观察:
福大大架构师每日一题
2024/02/28
1340
文心一言 VS 讯飞星火 VS chatgpt (201)-- 算法导论15.2 6题
大楼扔鸡蛋问题的求解
有道经典的算法题,两个一模一样的鸡蛋,某层之上扔鸡蛋就会碎。假如运气最差的话,问要测试多少次才能找出这层楼来。
四火
2022/07/15
2320
大楼扔鸡蛋问题的求解
程序员的数学---数学思维的锻炼
来看一道简单的题目:今天星期日,那么 100 天以后星期几? 这个问题最笨的方法就是数数了。不过那样也是颇为费事,从余数方向考虑:一个礼拜 7 天,100 天等于 14 个礼拜周期还剩两天(100 = 14*7 + 2)。于是答案就是星期 2 了。
指点
2019/01/18
1.1K0
程序员的数学---数学思维的锻炼
《剑指 offer》刷题记录之:递归和循环
本篇开始将介绍与算法和数据操作相关的面试题。有很多算法都可以用「递归」和「循环」两种不同的方式实现。通常基于递归的实现方法代码会比较简洁,但性能不如基于循环的实现方法。面试时我们需要根据题目的特点和面试官的需求灵活选择。
口仆
2020/08/14
6740
函数的定义和使用及代码复用和函数递归
老虎也淘气
2024/01/30
2030
函数的定义和使用及代码复用和函数递归
数据结构+算法(第06篇):再不会“降维打击”你就Out了!
“降维打击”之所以给人如此之震撼,在于它以极简的方式,从更高的、全新的技术视角有效解决了当前困局。
用户5224393
2019/06/03
5550
数据结构+算法(第06篇):再不会“降维打击”你就Out了!
【C语言新手村】新手任务:认识函数
C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等
f狐o狸x
2024/11/19
740
【C语言新手村】新手任务:认识函数
谷歌与递归
在讲解“递归”这个抽象概念之前,让我们来重温一下昔日往事。小时候,当我们在缠着长辈讲故事时,长辈们可能就用下面的故事来“忽悠”我们:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事!故事是什么呢?从前有座山,山里有座庙,庙里有个老和尚正在给小和尚讲故事!故事是什么呢……
用户1682855
2020/05/25
4940
来学Python啦,代码复用与函数递归
函数在编程中的作用无需小编多说,无论是哪一种语言,代码敲起来必然少不了函数,函数在使用中的过程中其需要注意的语法错误也不是特多。
小Bob来啦
2020/12/15
5100
来学Python啦,代码复用与函数递归
2的0次方为什么等于1?
计数简单来说就是数数,计数法就是数数的方法,严谨一点来说就是拿一种东西和要数的东西一一对应,只要不漏掉和不重复,那么数量就是准确的。
街角小林
2022/06/15
1.3K0
【组合数学】组合恒等式总结 ( 十一个组合恒等式 | 组合恒等式证明方法 | 求和方法 ) ★
② 归纳步骤 : 根据 数学归纳法的种类 , 进行不同方式的证明 , 这里有 第一数学归纳法 和 第二数学归纳法 两种归纳法 ;
韩曙亮
2023/03/28
2.1K0
【组合数学】组合数学简介 ( 组合思想 2 : 数学归纳法 | 数学归纳法推广 | 多重归纳思想 )
( 2 ) 归纳步骤 : 根据 数学归纳法的种类 , 进行不同方式的证明 , 这里有 第一数学归纳法 和 第二数学归纳法 两种归纳法 ;
韩曙亮
2023/03/28
7020
【组合数学】组合数学简介 ( 组合思想 2 : 数学归纳法 | 数学归纳法推广 | 多重归纳思想 )
搞定面试算法系列 | 贪心算法与正确性归纳证明
贪心算法就是让计算机模拟一个「贪心的人」来做出决策。这个贪心的人是目光短浅的,他每次总是:
江不知
2019/12/19
2.7K0
搞定面试算法系列 | 贪心算法与正确性归纳证明
相关推荐
如何更好地理解递归算法?Python实例详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验