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

递归-1

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

简介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]删除
最新教程 更多>
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-03-10
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-03-10
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-03-10
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-03-10
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-03-10
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-03-10
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-03-10
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-10
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-03-10
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-03-10
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-03-10
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-10
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-03-10
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-03-10

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

Copyright© 2022 湘ICP备2022001581号-3