递归(recurse)与迭代(iteration)

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还停不下来

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
《算法赏析》课程介绍 “软件 = 算法 + 数据结构”,算法是软件的灵魂。在信息时代,计算思维是分析复杂工程问题的重要思维方式,计算机则是求解问题的重要工具。本课程以计算机经典问题求解为导向,通用算法思维和自动编程流程图培养为目标,引入经典算法,精心安排课程的理论教学和编程实践。本课程学习将有助于学员提高计算思维能力及算法思维的能力。 本课程主要讲授计算机问题求解的经典算法设计方法和算法复杂度分析方法,主要内容包括计算机概述、计算机系统的组成、信息化及指标体系、操作系统、程序设计语言、算法简介、数的表示及存储、数据结构简介及顺序结构和选择结构、循环结构、循环的嵌套、算法复杂度分析,枚举算法,递归与分治策略,递归迭代的思想、求最大值最小值、线性查找、二分查找与冒泡排序以及选择与交换排序、插入和希尔排序。本课程除了强调经典的算法理论和模型,亦兼顾编程实践能力。力图使得学员面对复杂问题时,既能“想到”还能“做到”。 授课目标 培养算法思维,掌握枚举算法、分治策略、递归迭代、选择与交换排序等经典算法模型; 培养实践能力,掌握在存储空间和时间开销受限情况下的程序设计方法; 培养理论思维,掌握复杂问题的算法设计与分析方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值