递归(recurse)与迭代(iteration)

这篇具有很好参考价值的文章主要介绍了递归(recurse)与迭代(iteration)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概念

递归概念

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

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

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

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

迭代概念

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

迭代和递归的关系和区别

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

2.实际问题

求n的阶乘

图解理解
递归和迭代,数据结构,1024程序员节

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还停不下来文章来源地址https://www.toymoban.com/news/detail-691769.html

到了这里,关于递归(recurse)与迭代(iteration)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构--递归与分治

    汉诺塔分析: 以三层进行分析,大于三层分析情况是一样的。    八皇后问题:

    2024年02月11日
    浏览(32)
  • <数据结构>NO11.归并排序|递归|非递归|优化

    思路: 如果给出两个有序数组,我们很容易可以将它们合并为一个有序数组。 因此当给出一个无序数组时,我们先将它们均分为两组有序数组,在将这两组有序数组合并为一个有序数组;而将原数组分成2组 有序数组的思路又是归并排序 。 递归的结束条件是什么? 当递归区间

    2024年02月16日
    浏览(44)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(56)
  • 数据结构与算法(小议递归)

    递归是一种常用的算法设计,递归就是一种循环推理。简单来说就是调用原算法本身的算法。 这里主要探讨递归的使用, 用一个简单的例子来看: 这是一个很流行的裴波那契数列计算函数,很多编程书籍喜欢拿这个数列做例子。当然一般不会这么写~ 这函数看上去很优雅,

    2024年02月01日
    浏览(56)
  • 【数据结构】二叉树(遍历,递归)

     🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​ 中序遍历  后序遍历 递归结构遍历 前序 中序  求节点个数 求叶子节点个数  求树

    2024年01月19日
    浏览(41)
  • 【数据结构】——二叉树的递归实现,看完不再害怕递归

     创作不易,感谢三连加支持?! 递归无非就是相信它,只有你相信它,你才能写好递归!为什么?请往下看 在进入二叉树的实现之前,我们得先理解一遍递归,可能很多人对于递归感到恐惧或者害怕, 有时候还不敢面对, 其实大可不必,  递归其实分为两个东西: 1.递归

    2024年04月09日
    浏览(40)
  • 数据结构——计数与归并非递归

    重要的事说三遍! 学习!学习!学习! 努力!努力!努力! 代码实现: 思想: 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 代码实现: 计数排序的特性总结: 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。 时间复杂度:O(MAX(N,范围)) 空间

    2024年02月08日
    浏览(36)
  • 数据结构:完全二叉树(递归实现)

           如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。        完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编号为i,        当2*i = sum时,有左孩子,其编号为

    2024年01月24日
    浏览(49)
  • 数据结构:二叉搜索树(非递归实现)

    目录 1、二叉搜索树 2、二叉搜索树的相关操作。 1、查找 2、插入 3、删除 3、代码实现(非递归) 二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,小于其右子树中所有节点的值。这种特性使得二叉搜索树具有快速

    2024年03月08日
    浏览(38)
  • [数据结构——递归]母牛的故事(蓝桥杯1004)

    一、题目内容 题目描述: ​ 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? 输入格式: 输入数据由多个测试实例组成,每一个测试实例占一行,包括一个整数n(0n55),n的含义

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包