从“数学归纳法”到理解

数学归纳法的5种常用形式——证明题的利器 数学归纳法:你也许并非真的了解数学归纳法,快速了解数学归纳法的5种常用形式 阅读详情

我们在使用递归的时候需要满足一些基本条件,如果不满足的话,就有可能出现无限递归,最后会导致堆栈溢出了。

满足条件:

  1. 严格定义递归函数作用,包括参数,返回值,其他变量。

  2. 先一般情况,后特殊情况。

  3. 有退出条件。在一般情况下,能让递归正常退出的条件。

  4. 每次调用必须缩小问题规模,且新问题与原问题有着相同的形式,即规律。

上面的条件一环扣一环,也可以缩减成两个主要条件:有规律,有退出条件。我们以上面的条件,来结合案例进行理解。

[](()2.3 小栗子

[](()2.3.1 递归求和

例题:

1+2+3+…+n=?

第一步: 严格定义递归函数作用,包括参数,返回值,其他变量。

我们初看题目,可以知道这是一个简单的求和,即从1开始:1+2+3+…一直加到n。所以我们可以定义一个入参为n,返回值类型为int的一个方法,既然是递归求和,我们的方法名就叫recursionSum。

public static int recursionSum(int n) { //为了方便调用,我用了static

return 0;

}

System.out.println(“公众号:Coder编程:” + recursionSum(0));

那么我们第一步就做完了。

第二步: 先一般情况,后特殊情况。

我们先用一般的情况进行求和计算,例如代入1,2,3这样的一般情况。即:

public static int recursionSum(int n) {

if(n == 1) {

return 1;

}

if(n == 2) {

return 1+2;

}

if(n == 3) {

return 1+2+3;

}

return 0;

}

System.out.println(“公众号:Coder编程:” + recursionSum(3));

第三步: 有退出条件。在一般情况下,能让递归正常退出的条件。

其实,我们做完第二步,就会发现已经把第三步做完了。即有了让递归正常退出的条件!

第四步: 每次调用必须缩小问题规模,且新问题与原问题有着相同的形式,即规律。

这一步是最关键的,也是最核心的!我们需要找到其规律,并且能缩小问题的规模。我们会发现,当我们需要求第N个数的和的时候,我们必须知道前N-1个数的和,即 sum(N-1)。前N个数的和就是sum(N-1)+N。找到这个规律后,我们就可以定义一个临时变量sum来接收前N个数的和了。

public static int recursionSum(int n) {

if(n == 1) {

return 1;

}

if(n == 2) {

return 1+2;

}

if(n == 3) {

return 1+2+3;

}

int sum = recursionSum(n-1)+n;

return sum;

}

System.out.println(“公众号:Coder编程:前5个数的和” + recursionSum(5));

输出结果:15

我们优化一下:

public static int recursionSum(int n) {

if (n < 0){

throw new Exception(“参数不能为负!”);

}

if(n == 1) {

return 1;

}

return recursionSum(n-1)+n;

}

System.out.println(“公众号:Coder编程:前5个数的和” + recursionSum(5));

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】

是不是突然发现递归其实也没想的那么难?

[](()2.3.2 举一反三?

接下来我们难度进行升级!看大家能不能都理解了。我就不像上面求和那么啰嗦了!

[](()2.3.2.1 求阶乘

例题:求n的阶乘(n>1,n是正整数)

阶乘的递推公式为:factorial(n)=n*factorial(n-1),其中n为非负整数,且0!=1,1!=1

这里就不做过多说明,跟求后过程一致,可以模仿求和的过程,大家可以先自己尝试写下,下面我直接贴代码了:

public static int factorial(int n) throws Exception {

if (n < 0){

throw new Exception(“参数不能为负!”);

}else if (n == 1 || n == 0) {

return 1;

}else {

return n * factorial(n - 1);

}

}

System.out.println(“公众号:Coder编程:3的阶乘:” + factorial(3));

输出结果: 公众号:Coder编程:3的阶乘:6

[](()2.3.2.2 斐波那契数列

斐波那契数列 我想大家同样熟悉了解,下面我们继续回顾一下斐波那契数列到底是什么?

斐波那契数列图

斐波那契数列: 1、1、2、3、5、8、13、21…

可以看出从第三位起:第三项等于前两项之和。总结递推公式::Fib(n)=Fib(n-1)+Fib(n-2)。所以我们可以将前两位作为退出递归的条件。即:if(n==1) retrun 1 if(n==2) return 1

因此我们可以直接用公式(规律)和退出条件,写出编程代码:

public static int fib(int n) throws Exception {

if (n < 0) {

throw new Exception(“参数不能为负!”);

}else if (n == 0 || n == 1){

return n;

}else {

return fib(n - 1) + fib(n - 2);

}

}

System.out.println(“公众号:Coder编程:斐波那契数列:” + fib(3));

[](()2.3.2.3 汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置不同个数的金盘(如下图)。

游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。

操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

汉诺塔图

在总结规律和写代码之前,我们先来玩几把简单的(先一般后特殊):

注:我们以数字的大小作为盘子的大小。

  1. 一个盘子的情况:

1.1 将A柱子的1号盘子直接移动到C柱子中。

1.2 结束。

  1. 两个盘子的情况:

2.1 将A柱子的1号盘子移动到B柱子。

2.2 将A柱子的2号盘子移动到C柱子。

2.3 将B柱子的1号盘子移动到C柱子。

2.4 结束。

  1. 三个盘子的情况:

3.1 将A柱子的1号盘子移动到C柱子。

3.2 将A柱子的2号盘子移动到B柱子。

3.3 将C柱子的1号盘子移动到B柱子。

3.4 将A柱子的3号盘子移动到C柱子。

3.5 将B柱子的1号盘子移动到A柱子。

3.6 将B柱子的2号盘子移动到C柱子。

3.7 将A柱子的1号盘子移动到C柱子。

3.8 结束。


我们会发现,随着盘子数量的增加,盘子移动的难度也开始加大。

这时候不要害怕,我们回过头再来看这个问题:当盘子的数量是4个、5个…N个的时候,我们该如何解决呢?我们是不是可以用数学归纳法的思想或者递归的思想去解决呢?答案是:肯定的。这时候我们需要去找到他们的规律在哪?

我们再观察下上面在一般情况下移动盘子的规律在哪?

  • 1.当只有一个盘子的时候,可以将盘子直接移动到目标柱子C中。即退出条件。

  • 2.当只有两个盘子的时候,我们只需要将B柱子作为中介,将盘子1先放到中介柱子B上,然后将盘子2放到目标柱子C上,最后将中介柱子B上的盘子放到目标柱子C上即可。

第二点可以看成:当我们有N个盘子的时候,第N个盘子看成一个盘子,(N-1)个盘子看做成一个盘子。需要将(N-1)个盘子放在中介柱子B上,N个盘子放在目标柱子C即可。即规律。

当我们有三个盘子的时候,我们会发现一个问题: 角色变化

  1. 将A塔座的第(N-1)~1个盘子看成是一个盘子,放到中柱子B上,然后将第N个盘子放到目标柱子C上。这时候柱子A空了!柱子A成为中介柱子,柱子B成为起始柱子。

  2. 柱子B这时候有N-1个盘子,将第(N-2)~1个盘子看成是一个盘子,放到中介柱子A上,然后将柱子B的第(N-1)号盘子放到目标柱子C上。这时候柱子B空了!柱子B又成为了中介柱子,A成为了起始柱子!

重复1、2步骤,直到所有盘子都放到目标塔座C上结束。

总结一下:

  1. 从初始柱子A上移动包含n-1个盘子到中介柱子B上。

  2. 将初始柱子A上剩余的一个盘子(最大的一个盘子)放到目标柱子C上。

  3. 将中介柱子B上n-1个盘子移动到目标柱子C上。

move(3,“A”,“B”,“C”);

/**

  • 汉诺塔问题

  • @param dish 盘子个数(也表示名称)

  • @param from 初始柱子

高二数学知识点总结:用Python验证代数化复习方法 数学复习常常停留在背公式与翻PPT的层面,真正的提升在于将函数与导数、三角函数、解析几何、概率统计等模块统一到“代数化”思维中。利用编程工具验证数学性质,是理解抽象概念的有效路径——例如通过数值差分判断函数单调性、用泰勒展开验证三角恒等式、以蒙特卡洛模拟体会中心极限定理,以及借助pandas安排复习优先级。这种技术手段不仅能辅助教学备课,也能帮助高二学生建立可追踪的复习体系,将知识骨架转化为可验证的实践步骤。从基础概念到工程化验证,数学与编程的结合让复习从“看过”变成“会用”。 阅读详情

相关推荐

Bioconductor核心包(GO.db等)安装失败排查指南:从版本冲突到网络优化

本文详细解析了Bioconductor核心包(如GO.db)安装失败的常见原因及解决方案,包括版本冲突、网络问题和依赖关系。通过版本检查、镜像配置和依赖管理等方法,帮助用户高效解决安装难题,提升R语言生物信息学分析的工作效率。

weixin_29066781的博客 425

C语言的美学:斐波那契,你会吗?

至高的美学:斐波那契数列!

m0_69097508的博客 1573

Ubuntu系统下搭建QtCreator开发环境详细过程(Qt简介;Linux下安装QtCreator;Ubuntu安装后闪退蓝屏的解决方法)

Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面 (Graphical User Interface,简称 GUI) 程序。Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix、智能手机系统Android、ios、WinPhone, 嵌入式系统 QNX、VxWorks 等。

分享学习成长历程,Winter is coming! 8548

斐波那契数列(java实现)

斐波那契数列第n个数是多少? 解题技巧:前两个数之和等于第三个数 public static int result(int n) throws ValidationException{ if(n<0){ throw new ValidationException("非法参数"); } if(n==1||n==2){ return 1; }else{ return result(n-1)+result(n-2); } } ...

zero881的博客 758

两种方法解决这个问题OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

两种方法解决这个问题OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.在进行深度学习比如在训练yolov8模型时,在加载训练集和验证集时会报以下那个错误时会导致模型训练中断,有以下两个方法去解决这个问题,来使模型正常训练。

weixin_73044854的博客 2万+

国内用户稳定开通ChatGPT Plus会员的完整实操指南

ChatGPT作为当前最先进的AI对话模型,其技术原理基于Transformer架构和大规模语言预训练。通过深度学习技术,ChatGPT能够理解自然语言并生成高质量回复,在代码生成、文档分析等场景具有重要技术价值。对于需要高频使用的开发者而言,ChatGPT Plus会员提供了优先访问权和GPT-4模型支持等核心功能。在实际应用场景中,国内用户常面临支付限制和区域封锁等挑战。本文针对这些痛点,重点解析如何通过可靠的支付渠道和账号安全策略,实现稳定的会员开通方案,帮助用户突破技术使用壁垒,充分发挥AI助手在开

weixin_29042035的博客 954

C++斐波那契数列

斐波那契数列说的是一个数列中从第三位开始,每一项为前两项的和 #include"stdio.h" main() { int a=1,b=1,c; int ji; printf("%d\n",a); printf("%d\n",b); for(ji=1;ji<=20;ji++) { c=a+b; printf("%d\n",c); a=b; b=c; } } 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

别人笑我太疯癫,我笑他人看不穿。 1805

NVIDIA NCCL 源码解析:从XML拓扑到高性能通信图的构建

本文深入解析了NVIDIA NCCL如何将XML硬件拓扑文件转化为高性能通信图的核心过程。详细阐述了从创建CPU、GPU、NIC等节点,到建立PCIe、NVLink连接,再到计算链路带宽并进行关键排序的完整建图流程。该图是NCCL实现最优通信路径规划、充分发挥NVLink等高速互联性能的基石,直接影响分布式深度学习训练的效率。

convnet3designer的博客 307

斐波那契数列的实现--递归和迭代

一、定义 斐波那契数列:数列从第三项开始,每一项都等于前两项之和。如1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,… 数学定义(递归):F0=0,F1=1,Fn=Fn-1+Fn-2(n&gt;=2,n∈N*) 二、实现 1、递归法   递归满足2个条件:     1)有反复执行的过程(调用自身)     2)有跳出反复执行过程的条件(递归出口) 优点:程序...

qiannuo_的博客 1053

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 比赛,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-比赛,华为OD机考-比赛。

qq_45776114的博客 1700

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。版本如何关闭模块复用后铜皮自动从动态变成静态操作指导。如何关闭这个功能,具体操作如下。

weixin_54787054的博客 1259

斐波那契数列 Java 实现。

斐波那契额数列:0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368... 观察可以得出 从数列的第三项开始 前两项之和等于第三项 然后就可以得出通项公式 an=an-1十an-2(n ∈N*)这是一个线性递推数列。(引自百科) 思路清楚了 接下来可以实现编码 package com.company; /** * @Author fwp * @Date 20...

阿宽 1188

MIT液态神经网络(LNN)深度研究:原理、应用与未来

液态神经网络(Liquid Neural Networks, LNNs)代表了人工智能领域,特别是神经网络架构设计中的一次范式转移。它从根本上挑战了传统深度学习模型依赖大规模参数和静态架构的惯例,转而寻求一种更为动态、高效且受生物神经系统启发的计算范式。LNN的核心创新在于其将神经网络的计算过程从离散的、基于时间步的更新,转变为连续的、由微分方程驱动的动态系统演化。这种转变不仅赋予了模型前所未有的适应性和鲁棒性,还使其在处理复杂的时序数据和因果推断任务时表现出色。本章节将深入剖析LNN的技术原理,从其核心的

步子哥的博客 2588

从“数学归纳法”到理解“递归算法”

前言 相信大家在面试或者工作中偶尔会遇到递归算法的提问或者编程,我们今天来聊一聊从数学归纳法到理解递归算法。如有错误还请大家及时指出~ 本文已同步至 GitHub/Gitee/公众号,感兴趣的同学帮忙点波关注~ 1. 数学归纳法 1.1 简介 来源百度百科 数学归纳法(Mathematical Induction, MI)是一种数学证明方法,通常被用于证明某个给定命题在整个(或者局部)自然...

cowbin2012的专栏 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

从“数学归纳法”到理解“递归算法”!

如何证明 断言对所有自然数成立呢? 那么我们分两步: 证明对于N=1成立 第一步:证明对于N=1成立(这里的自然数可以是从1开始的整数,也可以是0开始的整数,不同的地方不一样。自然数只是一个命名)。我们只需要先从最小的自然数开始证明。这一步通常非常简单。关键是证明第二步。 证明N>1时:如果对于N-1成立,那么对于N成立 这一步并不是直接证明的,而是利用第一步,假设第一步N=1成立...

Coder编程的博客 1771

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从“数学归纳法”的角度理解“递归”算法

1.数学归纳法推演步骤 证明基本情况(通常是N = 1 的时候)是否成立。证明对于N=1成立。我们只需要先从最小的自然数开始证明。这一步通常非常简单。 证明N > 1 时,假设 N - 1 成立,那么对于N成立(N为任意大于1的自然数)。这一步并不是直接证明的,而是假设N-1成立,利用这个结论推出N是成立的。如果能够推出的话,就可以说:对于所有的N都成立。 2.递归 递归的基本思想:把规模大的问题转化为与之具有相同行为逻辑的最小规模的子问题来解决。 构成递归需具备的条件: 子问题必须是与原始问题

优快云19951017的博客 581

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

戴德金的数学归纳法定理证明,有哪些观念背景?——读戴德金之四

标题戴德金的数学归纳法定理证明,有哪些观念背景?——读戴德金之四 2021年读书的第一件事,就是弄明白一点戴氏的数归法。严格成型的数学归纳法,据说是1575年从意大利的一位数学学者(Maurolico)那里开始,距离今天大约有500年左右。发展到德国的戴德金那里,已经是19世纪末叶了。 在戴德金的数学随笔中,数归法被看作是一个定理,即他的随笔《数的意义与性质》一文中的定理59,戴德金称之为完全归纳法定理。但在我看来,这个定理好像是从一个普通的东西,英文为(thing)开始的,更像是用thing作为起点的一个

weixin_41670255的博客 593

离散数学问题集--问题5.16

归纳步长为2的归纳法使用

haoly1989的博客 911

数学题型的编程题

除数博弈 LeetCode1025题 爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。 最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。 如果玩家无法执行这些操作,就会输掉游戏。 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。 Note: 0 < x < N 且 N % x == 0.

杨6的博客 1108

数据结构:累加的递归实现

这种可视化输出对于理解递归的执行机制非常有帮助。递归调用(addTo(n-1))对应归纳步骤。终止条件(n <= 0)对应归纳基础。:函数不断调用自身,参数逐渐减小。:达到终止条件后逐层返回计算结果。这种对应关系是递归思维的核心。

2403_88362877的博客 224

《复变函数(史济怀,刘太顺)习题解答1》资源介绍

《复变函数(史济怀,刘太顺)习题解答1》资源介绍 去发现同类优质开源项目:https://gitcode.com/ 《复变函数(史济怀,刘太顺)习题解答1》是对《复变函数》教科书中的习题进行详细解答的资源。此资源包含了第一章“复数与复变函数”的习题解析。 在第一章的§1.1节中,主要讨论了复数的基本性质以及复变函数的概念。本资源特别提供了对习题2的详细解答,题目要求证明:对于任意n个复数( z )...

gitblog_06723的博客 422
上一篇: 从1G说到5G:“全新
下一篇: 你的生产环境还在“裸奔”吗
java100001
博客等级 码龄5年 4粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值