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

递归-1

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

简介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]删除
最新教程 更多>
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-02
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-02
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-02
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-02
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-02
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-07-02
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-02
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-02
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-07-02
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-07-02
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-02
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-02
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-02
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-07-02
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-07-02

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

Copyright© 2022 湘ICP备2022001581号-3