”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 递归-1

递归-1

发布于2024-11-08
浏览:665

简介1

函数调用自身的过程称为递归,
相应的函数称为递归函数.
由于计算机编程是数学的基本应用,因此让
我们首先尝试理解递归背后的数学推理。
一般来说,我们都知道函数的概念。简而言之,函数是
提供输入时产生输出的数学方程。例如:
假设函数 F(x) 是由下式定义的函数: F(x) = x^2 4
我们可以将此函数的 Java 代码编写为:

公共静态 int F(int x){
返回 (x * x 4);
}

现在,我们可以将 x 的不同值传递给该函数并接收我们的输出
因此。
在继续递归之前,让我们尝试理解另一个数学
称为 数学归纳原理 (PMI) 的概念

数学归纳原理 (PMI) 是一种证明陈述的技术,a
公式,或关于一组自然数的定理。它有
以下三步:
1.** 简单案例的步骤*:在这一步中,我们将证明
所需的陈述 基本情况,例如 n = 0 或 n = 1。
2.
* 假设步骤**:在这一步中,我们将假设所需的语句
对于 n = k 有效。

  1. 证明步骤:根据假设步骤的结果,我们将证明, 只要 n = k 为真,n = k 1 对于所需方程也成立。

例如:让我们用数学归纳法证明:
S(N): 1 2 3 ... N = (N * (N 1))/2
(前N个自然数之和)
证明:
步骤 1:当 N = 1 时,S(1) = 1 成立。
步骤 2:假设,对于 N = k,给定的陈述成立,即
1 2 3 .... k = (k * (k 1))/2
步骤 3:让我们使用步骤 2 来证明 N = k 1 的陈述。

证明: 1 2 3 ... (k 1) = ((k 1)*(k 2))/2
证明:

将(k 1)添加到步骤2获得的结果中的LHS和RHS:
1 2 3 ... (k 1) = (k*(k 1))/2 (k 1)

现在,从 RHS 端取 (k 1) common:
1 2 3 ... (k 1) = (k 1)*((k 2)/2)

根据我们试图证明的说法:
1 2 3 ... (k 1) = ((k 1)*(k 2))/2
由此证明。

递归的工作

总结以上三点我们就可以定义递归方法的步骤了
步骤:
● 基本情况:递归函数必须有一个终止条件,其中
该进程将停止调用自身。这种情况称为基本情况。如果没有基本情况,它将不断调用自身并陷入
无限循环。很快,就会超出递归深度*,并且会抛出
错误。
● 递归调用:递归函数将在较小的版本上调用自身
的主要问题。我们在编写此步骤时需要小心
正确找出你的小问题是什么至关重要。
● 小计算:一般我们在每个递归
中执行一次计算步骤 称呼。我们可以在递归调用之前或之后实现这个计算步骤
取决于问题的性质。

注意:递归使用存储递归调用的内置堆栈。因此,
递归调用的次数必须尽可能少,以避免内存溢出。如果
递归调用次数超过最大允许数量,
**将超过递归深度
**。
现在,让我们看看如何使用递归解决一些常见问题

问题陈述 - 求一个数的阶乘

方法:找出 PMI 的三个步骤,然后使用
将其关联起来 递归

  1. 归纳步骤:计算数字 n - F(n) 的阶乘 归纳假设:我们已经得到了n-1 - F(n-1)
  2. 的阶乘
  3. 用F(n-1)表示F(n):F(n)=n*F(n-1)。因此我们得到

public static int fact(int n){
int ans = 事实(n-1); #假设步骤
返回 ans * n; #从假设步骤解决问题
}

  1. 代码仍然不完整。缺少的部分是基本情况。现在我们将 试运行以查找需要停止递归的情况。考虑 n = 5:

Recursion -1

正如我们上面所看到的,我们已经知道n = 0的答案,即1。所以我们将
将此作为我们的基本情况。因此,代码现在变成:

公共静态 int 阶乘(int n){
if (n == 0) // 基本情况
返回 1;
别的
返回 n*阶乘(n-1); // 递归情况
}

版本声明 本文转载于:https://dev.to/vishnub33527201/recursion-1-3p1e?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-12-22
  • 插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入记录时如何解决“一般错误:2006 MySQL 服务器已消失”介绍:将数据插入 MySQL 数据库有时会导致错误“一般错误:2006 MySQL 服务器已消失”。当与服务器的连接丢失时会出现此错误,通常是由于 MySQL 配置中的两个变量之一所致。解决方案:解决此错误的关键是调整wait_tim...
    编程 发布于2024-12-22
  • 如何高效地将数据从SQL Server 2005迁移到MySQL?
    如何高效地将数据从SQL Server 2005迁移到MySQL?
    将数据从 SQL Server 2005 导出到 MySQL在数据迁移领域,从 SQL Server 2005 到 MySQL 的过渡可能会带来挑战。一项特别艰巨的任务是提取存储在近 300 个表中的大量数据并将其转换为兼容的 MySQL 数据库。使用 bcp 的局限性,例如无效的 CSV 格式以及...
    编程 发布于2024-12-22
  • 为什么我无法通过 Ruby on Rails 3 应用程序中的套接字文件连接到 MySQL 服务器?
    为什么我无法通过 Ruby on Rails 3 应用程序中的套接字文件连接到 MySQL 服务器?
    使用套接字连接在 Ruby on Rails 3 中建立 MySQL 连接在 macOS 上的 Ruby on Rails 3 环境中管理数据库连接时,用户尝试执行迁移时可能会遇到以下错误:“无法通过套接字'/tmp/mysql.sock'连接到本地MySQL服务器” (2)”。此错...
    编程 发布于2024-12-22
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-22
  • 从代码到聊天:帮助我免费部署我的 Node.js 和 React 应用程序!
    从代码到聊天:帮助我免费部署我的 Node.js 和 React 应用程序!
    大家好, 我很高兴分享我已经使用 Node.js、React 和 Socket.io 开发了一个聊天应用程序! ?这是一次令人难以置信的学习经历,我对它的结果感到自豪。该应用程序允许实时消息传递,并且我已经实现了用户身份验证和聊天室等功能。 现在我已经构建了它,我希望免费部署它,但我可以使用一些指导...
    编程 发布于2024-12-22
  • 为什么 `mysqli_query()` 返回“警告:mysqli_query() 期望参数 1 为 MySQLi,给定 null”?
    为什么 `mysqli_query()` 返回“警告:mysqli_query() 期望参数 1 为 MySQLi,给定 null”?
    理解“警告:mysqli_query() 期望参数 1 为 MySQLi,在中给出 null”错误在您尝试创建自定义CMS,您遇到以下错误消息:“警告:mysqli_query() 期望参数 1 为 MySQLi, null Give in"错误原因此错误表明执行 SQL 查询的 mysq...
    编程 发布于2024-12-22
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-22
  • 为什么接口对于掌握 Java 中的面向对象编程至关重要?
    为什么接口对于掌握 Java 中的面向对象编程至关重要?
    接口:增强 OOP 的桥梁在 Java 世界中,了解接口的原因、内容和方式对于掌握面向对象编程。这里有一个全面的细分:什么是接口?接口是纯抽象的集合——没有实现和最终字段的抽象方法。这意味着接口定义契约而不是提供代码片段。为什么使用接口?接口提供了几个好处:合同执行: 他们确保实施类遵守特定的解耦:...
    编程 发布于2024-12-22
  • 像 V8 和 JavaScriptCore 这样的 JavaScript 引擎是否使用字符串实习?
    像 V8 和 JavaScriptCore 这样的 JavaScript 引擎是否使用字符串实习?
    JavaScript引擎会使用String Interning吗?简介:在编程中,string interning是指重用现有字符串对象的过程而不是为相同的字符串创建新的字符串。这种优化技术旨在减少内存使用并提高性能。问题是,常见的 JavaScript 引擎,包括 V8 和 WebKit 的 Ja...
    编程 发布于2024-12-22
  • 如何捕获 Go 模板输出并将其分配给变量?
    如何捕获 Go 模板输出并将其分配给变量?
    在 Go 中捕获模板输出在 Go 模板中,捕获子模板的输出或直接将其分配给变量是默认不支持。不过,这可以通过注册自定义函数并使用字节缓冲区接收模板的结果来实现。自定义函数注册要捕获模板输出,请注册Template.Funcs() 的函数将模板名称作为参数并以字符串形式返回模板的输出:func exe...
    编程 发布于2024-12-22
  • Go 的短路评估会影响条件语句的性能吗?
    Go 的短路评估会影响条件语句的性能吗?
    Go 中的短路求值在编程中,短路求值是一种仅在需要确定周围语句的结果时才对表达式求值的技术。这通常用在条件语句中,如果先前的条件已经为 false,则无需对多个条件进行求值。Go 实现逻辑运算符(&& 和 ||)的短路求值,与许多其他编程类似语言。这意味着在 if 语句中,解释器将从左到右评估条件,...
    编程 发布于2024-12-22
  • HTML 格式标签
    HTML 格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2024-12-22
  • 我应该使用哪些 g++ 警告标志来进行全面的 C++ 代码分析?
    我应该使用哪些 g++ 警告标志来进行全面的 C++ 代码分析?
    使用 g 进行 C 编译的彻底而详细的警告标志 Gcc 提供了一套全面的警告标志来帮助开发人员检测潜在问题他们的代码。要在 C 中启用彻底且详细的警告,请考虑以下建议:基本警告:-迂腐:遵守严格C语言标准。-Wall:激活所有普遍接受的warnings.-Wextra:将警告范围扩大到-Wall之外...
    编程 发布于2024-12-22
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-12-22

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3