程序员数学 | 数学归纳法

news/2024/9/29 2:06:07/

目录

    • 一、数学归纳法是什么
    • 二、使用编程来模拟数学归纳法的证明

人类做重复性的劳动没有效率,而计算机却能更快更准确的完成重复性劳动。所以以重复为特点的迭代法在编程中有着⼴泛的应⽤。实际项目中是否可以用不断更新变量值或者缩小搜索的区间范围的方法,来获得最终的解(或近似解、局部最优解)?如果是,那么你就可以尝试迭代法。

程序员数学 | 迭代法

还有某些特定的迭代问题,其实可以用数学归纳法,避免⼀步步的计算,直接从理论上证明某个结论,节约⼤量的计算资源和时间。

一、数学归纳法是什么

数学归纳法最早出现于Francesco Maurolico的Arithmeticorum libri duo(1575年)。Maurolico利用递推关系巧妙地证明出前n个奇数的总和是n^2,由此总结出了数学归纳法。

在数论中,数学归纳法(Mathematical Induction)是以一种不同的方式来证明任意一个给定的情形都是正确的(第一个,第二个,第三个,一直下去概不例外)的数学定理。

对于类似⽆穷数列的问题,我们通常可以采⽤数学归纳法来证明。

  • 常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:
    1.证明当n= 1时命题成立。
    2.假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数)

依然用那个麦子的故事举例:

棋盘的第⼀个小格内放⼊⼀粒麦子,在第⼆个小格内放⼊两粒,第三小格内放⼊给四粒,以此类推,每⼀小格内都⽐前⼀小格加⼀倍的麦子,直到放满64个格子。

为了便于理解,我们将这一命题分为两个命题来证明:
1、第 n n n个棋格放的麦粒数为 2 n − 1 2^{n-1} 2n1
2、前 n n n个棋格放的麦粒数总和为 2 n − 1 2^{n}-1 2n1

  • 先来证明第⼀个子命题:
    1)当 n = 1 n=1 n=1的时候,第⼀格内的⻨粒数为 1 1 1,和 2 1 − 1 2^{1-1} 211相等。
    2)假设第 n − 1 n-1 n1格的⻨粒数为 2 n − 2 2^{n-2} 2n2。那么第 n n n格的⻨粒数为第 n − 1 n-1 n1格的 2 2 2倍,也就是 2 n − 2 ∗ 2 = 2 n − 1 2^{n - 2}*2=2^{n-1} 2n22=2n1

所以,第⼀个子命题成⽴。

  • 再证明第⼆个子命题。
    1) n = 1 n=1 n=1的时候,所有格⼦的⻨粒总数为 1 1 1
    2)假设前 n − 1 n-1 n1格的⻨粒总数为 2 n − 1 − 1 2^{n-1}-1 2n11,基于前⼀个命题的结论,第n格的⻨粒数为 2 n − 1 2^{n-1} 2n1。那么前 n n n格的⻨粒总数为 ( 2 n − 1 − 1 ) + ( 2 n − 1 ) = 2 ∗ 2 n − 1 − 1 = 2 n − 1 (2^{n-1}-1)+(2^{n-1})=2*2^{n-1}-1=2^{n}-1 (2n11)+(2n1)=22n11=2n1

第二个子命题也成立。

和使用迭代法的计算相比,数学归纳法最⼤的特点就在于“归纳”⼆字。它已经总结出了规律,只要我们能够证明这个规律是正确的,就没有必要进⾏逐步的推算,可以节省很多时间和资源。

二、使用编程来模拟数学归纳法的证明

仔细观察⼀下数学归纳法,其实与函数的递归调用很像。

在代码的实现中,我们可以将其转为函数的递归(嵌套)调用,被调用的函数逐步返回 n − 1 n-1 n1时命题是否成⽴,直到被调用的函数回退到 n = 1 n=1 n=1的情况。

递归调用的代码和数学归纳法的逻辑是⼀致的。理解了数学归纳法就很容易理解递归调用。只要数学归纳证明的逻辑是对的,递归调用的逻辑就是对的,稍有不同的是,递归编程的代码需要返回若⼲的变量。

python"># 初始化第一个格子的麦子数量
grains = [1]def count_grains(row):# 基础情况:如果已经到了第六十四行,返回0表示满了if row == 64:return 0# 根据规则,当前行的麦子数量是上一行的两倍current_row = grains[row - 1] * 2grains.append(current_row)# 递归计算下一行return count_grains(row + 1)# 使用递归计算所有64行的总麦子数
total_grains = count_grains(1) + grains[-1]
print(f"总共需要的麦子数量为: {total_grains}")

在这里插入图片描述


http://www.ppmy.cn/news/1531723.html

相关文章

Qt day01

#include "widget3.h" #include<QDebug> #include<QPushButton> #include<QLineEdit> #include<QLabel> Widget3::Widget3(QWidget *parent): QWidget(parent) {qDebug()<<"这个界面的标题"<<this->windowTitle();…

MySQL实战教程:从小白到大神的进阶之路!

目录 一、MySQL概述1、MySQL简介1.1 MySQL的历史背景1.2 MySQL的特点1.3 MySQL的应用场景1.4 MySQL的版本 2、MySQL发展历程2.1 MySQL的起源2.2 MySQL的早期发展2.3 MySQL的成熟与普及2.4 MySQL的商业化与收购2.5 MySQL的持续创新 3、MySQL应用场景3.1 Web应用程序3.2 企业级应…

html TAB切换按钮变色、自动生成table

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

查看和升级pytorch到指定版本

文章目录 查看和升级pytorch到指定版本查看pytorch的版本python 命令查看pytorch的版本使用pip 命令查看当前安装的PyTorch版本升级PyTorch到指定版本 升级到特定的版本 查看和升级pytorch到指定版本 查看pytorch的版本 python 命令查看pytorch的版本 通过Python的包管理工具…

EasyCVR全方位安全守护智慧电厂:构建高效视频监控系统优势分析

随着信息技术的飞速发展和数字化时代的到来&#xff0c;电厂作为能源供应的重要枢纽&#xff0c;其安全性和管理效率成为社会各界关注的焦点。为了满足电厂对高效、智能、可靠视频监控系统的需求&#xff0c;基于EasyCVR平台建设的电厂视频监控系统应运而生。 一、系统构成 基…

嵌入式开发Git使用

Git简介 1、git中文件有三种状态&#xff1a; 已提交&#xff08;committed&#xff09;&#xff1a;表示数据已经安全的保存在本地数据库中&#xff1b;已修改&#xff08;modified&#xff09;&#xff1a;表示修改了文件&#xff0c;但还没保存到数据库中&#xff1b;已暂…

【React】JSX基础知识

1. JSX的本质 JSX并不是标准的js语法&#xff0c;而是js语法扩展&#xff0c;浏览器本身无法识别&#xff0c;需要进行解析。解析工具&#xff1a;babel 2. JSX使用的4个高频场景 使用引号传递字符串使用js变量函数调用和方法调用使用js对象 function App() {const jsVar …

关于视频监控介入的部分内容,使用的是海康H5web播放的模式

这是原发直接能在系统中使用。里面的样式自己修改&#xff0c;主要是在引入时出现黑色的框就是引入成功&#xff0c;需要在public文件夹中引入h5player.min.js文件就可以。 <template><div class"Shiping"><el-container><el-header><di…