1.概念

递归概念

递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。
注意:递归必须要有一个退出的条件!

递归算法解决问题的特点:

1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。

迭代概念

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代和递归的关系和区别

从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环。
在循环的次数较大的时候,迭代的效率明显高于递归。

2.实际问题

求n的阶乘

图解理解

public class Demo6 {public static void main(String[] args) {System.out.println(fact(5));}    /*** 求n的阶乘f1(n) 求n的阶乘--->fact(n-1)求n-1的阶乘* 1.找重复(规模更小);n*(n-1)的阶乘,求n-1的阶乘是原问题的重复(规模更小)——子问题* 2.找变化;变化的量应作为参数* 3.找边界;出口*/public static int fact(int n) {if(n == 1) {return n = 1;}else {return n*fact(n-1);}}
}

斐波那契数列

递归实现

int fib(int n){  if(n>1) return fib(n-1) + fib(n-2);  else return n; // n = 0, 1时给出recursion终止条件  }  

迭代实现

int fib(int n){  int i, temp0, temp1, temp2;        if(n<=1) return n;  temp1 = 0;  temp2 = 1;  for(i = 2; i <= n; i++){  temp0 = temp1 + temp2;  temp2 = temp1;  temp1 = temp0;  }  return temp0;
} 

3.自己遇到的问题

在做银行的题目的时候,有遇到一道递归求电阻的题目。但是当时自己写的代码报出StackOverflowError错误。
代码

/*** @author Kino* @create 2022-10-20 20:23*/
public class Test {public static void main(String[] args) {double digui = digui(5, 1, 1, 1);
//        double digui = digui1(5, 1, 1, 1);System.out.println(digui);}public static double digui(int level,double r1,double r2, double r3){if (level == 1){return r1 + r2 + r3;} else {double sum = r1 + r2 + (r3 * digui(level-1,r1,r2,r3)) / (r3 + digui(level-1,r1,r2,r3));return sum;}};public static double digui1(int level,double r1,double r2, double r3){if (level == 1){return r1 + r2 + r3;} else {return r1 + r2 + (r3 * digui1(--level,r1,r2,r3)) / (r3 + digui1(--level,r1,r2,r3));}};
}

当运行digui1方法的时候就会报出StackOverflowError错误。而修改后的digui方法就可以正常运行。在运行digui1方法的debugger的过程中发现,level1的时候递归并没有停止,而是继续往下走了,下一个就是level0。

4.解决方法

当把–level改为level-1的时候就能够运行成功,在分析一波了。找到了原因所在。
用–level永远的修改了level的值,所以它会走到1还停不下来

递归(recurse)与迭代(iteration)相关推荐

  1. 树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现

    前面提到树的3中遍历迭代实现的时候,讲到:还有一种思路,直接针对递归的实现方式,想办法通过栈来实现递归,得到的还是和上面一样 一般的递归改成迭代的方法,你需要知道迭代指针是如何走的,还要借助数据结构才 ...

  2. 回溯法之递归回溯和迭代回溯

      回溯法有通用解题法之称,它可以系统的搜索一个问题的所有解或者任意解.它在问题的解空间树中,按深度优先策略从根节点出发搜索解空间树,算法搜索至解空间树的任意一个结点时,先判断该节点如(子树)是否包含 ...

  3. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  4. 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!

    单纯移除一个节点那还不够,要修剪! ❞ 669. 修剪二叉搜索树 题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/ 给定 ...

  5. 扁平化嵌套列表迭代器 [树的递归前序遍历 + 迭代前序遍历]

    递归|迭代的前序遍历 前言 一.扁平化嵌套列表迭代器 二.前序遍历(无需访问非叶节点) 1.递归实现 2.栈模拟 3.惰性栈模拟(next时再入栈) 总结 参考文献 前言 问题转换:将需求确认,结合已 ...

  6. 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代

    理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2 二叉树的常见遍历形式有:前序遍历.后序遍历.中序遍历和层序遍历 前 ...

  7. day11二叉树的遍历(递归遍历和迭代遍历)

    二叉树的迭代遍历有点难理解,需要手动多模拟模拟 1.二叉树的种类 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树. 完全二叉树的定义如下:在 ...

  8. 华为路由器的递归路由、迭代路由

    一.什么是路由递归? 路由必须有直连的下一跳才能够指导转发,但是路由生成时下一跳可能不是直连的,因此需要计算出一个直连的下一跳和对应的出接口,这个过程就叫做路由递归.路由递归也被称为路由迭代. [AR ...

  9. 关于函数递归和函数迭代,我的理解

    在C语言里函数递归是什么呢?我的理解是函数自己调用自己,但是不能一直调用,有限制条件,当满足限制条件后,函数停止调用.说到这我就想说一下我对函数的理解,函数我理解为实现某种功能的一串代码,由于函数讲究 ...

  10. 2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)

    //! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样, //! 比较抽象,建议画图理解,比较重要 void BinarySearchTreesZH::preord ...

最新文章

  1. Renascence架构原理——遗传规划算法
  2. hive中的数据库与mysql中的hive数据库的关系
  3. python软件测试面试题及答案_软件测试面试 | 一道大厂算法面试真题,你能答上来吗?(附答案)...
  4. centos php5.6 phpize,centos7-install-php5.6.40
  5. python 直播源地址_如何获取视频的直播源地址
  6. python xps_python处理xps文件_从XPS文档中提取文本
  7. 圆柱体的表面积,三位数反转,交换变量
  8. python3GUI--微博图片爬取工具V1.5(附源码)
  9. 3gqq幻想西游〓宠物、副本、攻略、攻城、极品怪〓
  10. Windows11安装Android子系统——使用篇
  11. 【c++】CTGU2022春校赛原题详解:出题人的大航海BFS
  12. SLT学习(一)——STL组成介绍
  13. 每日一诗词 —— 热爱生命
  14. 个人电脑windows装青龙面板,本地运行,无需服务器,本人亲测成功
  15. 数据库系统概念 - 数据模型,关系模型,关系,候选码,主码,外码
  16. 单词快速记忆day40
  17. 灌注桩如何计算机械台班,钢护筒造价计算及套定额
  18. 「团队管理」UCD领域如何带领前端开发团队
  19. chrome 浏览器 console 加入 jquery 测试调试 一介布衣
  20. 人脸识别微笑检测(基于卷积神经网络CNN)

热门文章

  1. 解决计算机主机与打印机共享打印机,主机上的打印机已经设置了共享可是另外的电脑却不能用也搜索不到共享打印机...
  2. PCAN二次开发,用MFC发送一帧CAN消息
  3. 扩展卡尔曼滤波EKF—目标跟踪中的应用(算法部分)
  4. libCef退出流程整理
  5. 褚霸 - Erlang开发实践
  6. 一周小结(2019/12/23)
  7. 【Pytorch编程】Pytorch-Ignite v0.4.8的安装以及简单使用
  8. 学生环境保护绿色家园 WEB静态网页作业模板 大学生环境保护网页代码 dreamweaver网页设计作业制作 dw个人网页作业成品
  9. IE浏览器无法连接网络的解决办法
  10. Pr_cc 学习笔记(一)流程演示