Java将递归改成循环的通用方法

PR控制以及使用PR控制用于单相离/并网逆变器 最近想学习一下并网逆变器,需要用到PR控制,全网找遍了许多学习资料,终于掌握的差不多了,在此做个记录,以及个人对PR(Proportional Resonant)控制的理解。在去年7月准备电赛的时候偶然看到有几篇讲解数字滤波器,第一次接触传递函数离散化,深刻被数字时代的数字方式折服,改改代码,就可以实现不同的截至频率,甚至不同阶数,而模拟方式还要改元器件。当时就感觉这玩意太他妈牛逼了,很想学懂它,奈何学不会呀。后面全身心做电赛,就忘了这事儿。直至最近学习PR控制,当初的感觉又回来了,一股劲儿吃下来了。 阅读详情

用Stack或LinkedList来实现内存中的出栈入栈过程,即可将递归改成循环。


正式开始前先厘清几个概念:

  • 循环(loop) - 最基础的概念, 所有重复的行为
  • 递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况
  • (数学)迭代(iterate) - 在多次循环中逐步接近结果
  • (编程)迭代(iterate) - 按顺序访问线性结构中的每一项
  • 遍历(traversal) - 按规则访问非线性结构中的每一项

确切地说,递归也属于循环。下文中的「循环」特指非递归的循环。


第一个例子用求阶乘,顺便加了迭代方法。

import java.util.Stack;

public class Factorial{
    public static void main(String[] args){
        Factorial f = new Factorial();
        System.out.println(f.recursion(5));
        System.out.println(f.loop(5));
        System.out.println(f.iteration(5));
    }

    /**
     * 递归求阶乘
     */
    public int recursion(int n){
        if (n == 1) return 1;
        return recursion(n-1) * n;
    }

    /**
     * 循环求阶乘
     */
    public int loop(int n){
        Stack<Integer> stack = new Stack<Integer>();
        int result = 1;
        stack.push(n);
        while(!stack.isEmpty()){
            n = stack.pop();
            result *= n;
            if (n > 1) stack.push(n-1);
        }
        return result;
    }

    /**
     * 迭代求阶乘
     */
    public int iteration(int n){
        int result = 1;
        for(int i = 1; i <= n; i++){
            result *= i;
        }
        return result;
    }
}



第二个例子是快速排序。递归快排大量数量时,容易爆栈。这时可以改成循环。

import java.util.Random;

public class Sorts{
    private static Random rand = new Random();

    public static void main(String[] args){
        int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62
            ,99,98,54,56,17,18,23,34,15,35,25,53,51}; 
        quickSort(a);
        System.out.println(Arrays.toString(a));
        int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62
            ,99,98,54,56,17,18,23,34,15,35,25,53,51}; 
        quickSortByLoop(a);
        System.out.println(Arrays.toString(a));
    }

    /**
     * 快速排序
     * 递归实现
     */
    private static void quickSort(int[] arr, int start, int end){
        if (start >= end) return;
        int base = arr[start + rand.nextInt(end-start+1)]; //中轴值
        int left = start, right = end; //指示左右两端未排序的边界索引
        int i = start; // 用于排序
        while(i <= right){
            if (arr[i] < base){ //小于中轴值则移到左侧
                swap(arr, left++, i++);
            }else if (arr[i] > base){ //大于中轴值则移到右侧
                swap(arr, right--, i); //当前i位置的值未排序,故i不自增
            }else{
                i++;
            }
        }
        //排完后left左侧均为小于base的数,right右侧均为大于base的数
        quickSort(arr, start, left-1);
        quickSort(arr, right+1, end);
    }


    /**
     * 快速排序
     * 循环实现
     */
    private static quickSortByLoop(int[] arr){
        Stack<Integer> stack = new Stack<Integer>();
        int start = 0;
        int end = arr.length - 1;
        stack.push(start);
        stack.push(end);
        while(!stack.isEmpty()){
            end = stack.pop(); // 顺序很重要
            start = stack.pop();
            if (start < end){ // 开始排序
                int i = start;
                int base = arr[start + rand.nextInt(end-start+1)]
                int left = start;
                int right = end;
                while(i <= right){
                    if (arr[i] < base){
                        swap(arr, left++, i++);
                    }else if (arr[i] > base){
                        swap(arr, right--, i);
                    }else {
                        i++;
                    }
                }
                // ----右半边----
                stack.push(right + 1);
                stack.push(end);
                // ----左半边----
                stack.push(start);
                stack.push(left - 1);
            }
        }
    }
}



Star CCM+中衍生零部件下的阈值应用与区域内删除目标网格 同样的在绘制网格结束后,有时出现负体积网格或质量差的网格,为了节约时间成本,可能会选择将负体积的网格或质量差的网格删除。弹出相应的窗口,在窗口中选择相应的区域①,选择标量函数②(此处以网格体积变化为例),选择模型③,设置阈值④,选择No Dispalyer,会根据需求选择显示,最后点击Create⑥完成创建。此处以温度为例,若出现温度异常点,首先在①栏中勾选Function,然后在下面点击⑤Select,在弹出的Function窗口中选择温度场函数,再点击④Identify,查找温度异常网格数量。 阅读详情

相关推荐

从零到一:YOLOv11高帧率模型在RDK X5上的ONNX转换与部署实战

本文详细介绍了将最新的YOLOv11高帧率模型部署到地平线RDK X5开发板的完整实战流程。内容涵盖从PyTorch模型导出ONNX、地平线工具链环境配置与模型量化编译,到编写高效的板端推理代码,并针对高帧率目标进行了后处理优化。通过实战避坑指南,帮助开发者在RDK X5上实现30FPS以上的实时目标检测。

weixin_29089057的博客 139

递归转循环的通用方法

1.递归 定义:程序调用自身的编程技巧称为递归。 栈与递归的关系:递归是借助于系统栈来实现的。每次递归调用,系统都要为该次调用分配一系列的栈空间用于存放此次调用的相关信息:返回地址,局部变量等。当调用完成时,就从栈空间内释放这些单元,在该函数没有完成前,分配的这些单元将一直保存着不被释放。 2.递归转化为循环 记得有人说过“所有递归都能转化为循环”,某晚睡不着思考了一下这个问题

To be what you what to be! 2万+

AI Agent Harness Engineering 创业PMF验证工具:用户满意度+留存率+业务指标监测表

在AI Agent创业的浪潮中,我们看到了无数产品如雨后春笋般涌现,但最终能够真正找到PMF并存活下来的却寥寥无几。根据CB Insights的数据,创业公司失败的首要原因(占42%)是"没有市场需求"——换句话说,就是没有找到PMF。AI Agent产品由于其特殊性(交互范式的变革、技术复杂度高、用户期望管理困难等),PMF验证变得更加具有挑战性。传统的SaaS产品PMF验证框架虽然有参考价值,但无法完全适用于AI Agent这种新型产品形态。

AI智能探索者的博客 332

如何将递归转换为循环

动机 递归效率没有循环高,有额外的方法调用开销 堆栈溢出(stackoverflow) 递归有时挺难理解(不过很多算法用递归最容易实现) 直接法 首先找到递归的结束条件,并且每次递归调用肯定是逼近结束条件(Base Case) 实现一个相同结束条件的循环,每次循环逼近结束条件 public class CountDown { public void countDown(int n) { if(n == 0) return; System.out.println(n + "...");

bill的博客 2840

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7068

别再瞎猜了!Fluent瞬态计算时间步长到底设多少?一个公式+实战案例搞定

本文详细解析了Fluent瞬态计算中时间步长的设置方法,通过黄金公式和实战案例,帮助工程师准确确定时间步长,避免计算发散和资源浪费。文章还介绍了动态调整策略和典型工程场景的参数优化,提升仿真效率和精度。

weixin_42638178的博客 426

十步法将递归程序快速转变成迭代或循环程序

前言:在有些情况下,我们更倾向于使用递归函数,如排序(合并排序)或树相关操作的算法(heapify/ heapify)。但是,递归函数在某些环境中,如在Visual C ++中,如果调用层次过深,可能会出现如堆栈溢出。许多专业的开发人员可能已经知道如何更改递归功能用迭代函数或使用栈(堆栈)和while循环解决(模拟递归的过程)堆栈溢出问题。         如果您使用的是递归函数,因为你不控制调

xiaoding133的专栏【Stay hungry,Stay foolish】 3161

Java + Selenium + TestNg + Allure Web UI 自动化

我们知道,在Python中针对Web UI自动化有Python + Selenium + Pytest/Unittest +Allure的技术栈。那么对于Java而言,也有其独特的Web UI 自动化技术栈。相同的,我们同样的运用Selenium框架,测试报告同样运用Allure。不同的是,我们运用的语言由Python转化为了Java,测试用例管理框架从Pytest转化为了TestNG。

qq_45594960的博客 1913

算法 递归和循环的转换

【直接转化 】 消除尾递归和单向递归 1. 尾递归 指在递归算法中递归调用语句只有一个 且处于算法的最后private static int factorialByRecurision(int num) { if (num == 1) { return 1; } return num * factorialByRecur

Heqianqian的博客 2906

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2657

java 代替递归_Java将递归改成迭代的通用方法

用Stack或LinkedList来实现内存中的出栈入栈过程,即可将递归改成循环。第一个例子用求阶乘,顺便加了迭代方法。import java.util.Stack;public class Factorial{public static void main(String[] args){Factorial f = new Factorial();System.out.println(f.recu...

weixin_34315803的博客 1583

嵌入式系统开发笔记112:通过有人云测试MQTT

项目中使用到“有人”公司的WH-LTE-7S0模块,本文讲解通过有人云进行MQTT测试的方法。

snmplink的博客 999

Java方法的递归

Java方法的递归是指一个Java方法直接或间接地调用自身,以完成重复或嵌套的计算任务。递归常用于处理具有自相似性的问题,通过分解问题为更小、更简单的子问题来解决整个问题。递归方法需要明确定义递归终止条件,以防止无限循环。斐波那契数列是一个数学上的数列,其形式为 1, 1, 2, 3, 5, 8, 13, 21, 34, …。数列中的每个数字都是前面两个数字之和。也就是说,第三个数字是前两个数字之和,第四个数字是前两个数字之和,以此类推。

qq_74013365的博客 1129

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java将递归改成迭代的通用方法

用Stack或LinkedList来实现内存中的出栈入栈过程,即可将递归改成循环。 第一个例子用求阶乘,顺便加了迭代方法。 import java.util.Stack; public class Factorial{ public static void main(String[] args){ Factorial f = new Factor...

dlxqlig0806的博客 404

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[Java]方法递归——经典案例

@[Java]方法递归——经典案例 Java中的方法递归 方法递归 递归是一种算法,在程序设计语言中广泛应用。 方法调用自身的形式称为方法递归(recursion)。 递归的形式 直接递归:方法自己调用自己。 间接递归:方法调用其他方法,其他方法又回调方法自己。 递归算法三要素 递归的公式 递归的终结点 递归的方向必须走向终结点 通过一些经典案例,加深对方法递归的思想。 文章目录Java中的方法递归一、有规律的递归求1-n的和猴子吃桃问题二、无规律的递归啤酒问题三、递归扩展应用文件搜索功能快捷键合理的创

qq_47156956的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java——方法 递归使用及练习

文章目录Java方法递归1.递归的概念2.递归执行过程分析3.练习题练习一练习二练习三练习四练习五练习六完! Java方法递归 1.递归的概念 一个方法在执行过程中调用自身, 就称为 “递归”. 递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式. 递归的注意点: 1.程序调用自己 2.这个递归程序一定要有一个趋近于中止的条件. 3.核心:写递归程序的时候,需要自己来推导一个递推公式. 例: 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始

rain67的博客 1万+

多重循环、方法、递归作业及答案

一、选择题 分析下面的Java多重循环代码片段,编译运行后的输出结果是( )。(选择一项) for (int i = 0; i < 6; i++) { int k = ++i; // while (k < 5) { System.out.print(i); // break; } } A. 024 B. 02 C. 123 D. 13 给定如下J...

weixin_39571268的博客 2928

【Java】如何高效计算斐波那契数列:递归与循环的比较与优化

斐波那契数列是计算机科学和数学中经典的数列之一,它不仅在理论上具有重要意义,在实际编程中也时常作为学习算法的重要内容。在本文中,我们将深入探讨两种常见的计算斐波那契数列的方法:递归与循环。我们将详细解释这两种方法的实现方式,分析它们的优缺点,并探讨如何通过优化来提高计算效率。Java斐波那契数列(Fibonacci Sequence)由意大利数学家列昂纳多·斐波那契在《算术书》中提出 2025.2.24-✍56min

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 2153

Java递归,递归改循环

Java递归,递归改循环 为什么大家都说不建议用递归? 递归容易造成栈溢出,在jdk1.5前虚拟机给每个栈桢的运行空间128kb,在1.5以后为1m的运行空间.递归是指先进后出,也就是说第一进栈的对象会最后一个出站,然后栈桢的空间只有1m,生产环境的数据需要递归的深度,一般情况下我们无法通过测试来进行模拟。所以对于递归的深度不可把控的情况下,是有栈溢出的风险。 一个简单的例子测试递归的深度 递...

qq_31273003的博客 2522

关于递归方法和普通循环方法的对比

近来在java交流群看到别个使用递归方法,好奇之下了解了这方面的知识。 递归方法:就是方法体调用自身方法的的一种算法,递归方法的主要优点是,代码简洁易懂。缺点是,递归次数太多的情况下容易引发栈溢出。 double a = System.currentTimeMillis(); Main.fun1(100000L); //调用递归方法10万次 ...

u011573295的博客 676

java递归简单例子_尾递归优化

上一篇文章《谈递归时,我们在谈论什么》,我们讲解了递归调用的过程是怎么样的。还有这篇文章:《面试官的一次面试经历分享》里谈到了尾递归的问题。我们今天就来讲一下尾递归的事情。在scala编程中,或者说在函数式编程中,是鼓励大家使用递归,而不是循环来解决问题。这是因为循环会引入变量,而变量是函数式编程中被视为洪水猛兽一样的存在。那是另外一个话题,在我的scala课程中会详细讲解。这里就不多做解释了。我...

weixin_39655981的博客 210

Java实现阶乘运算(递归、循环)

Java实现阶乘运算(递归、循环) 开发工具与关键技术:Myeclipse 10,java语言 作者:清晨 撰写时间:2019.4.17 下面我们使用递归与循环 以及输出的截图: /** * 递归阶级算法,for循环 */ public class Recursion { public static void main(String[] args) { System.out.pr...

清晨的博客 5630

Java中递归和循环的优劣

Java中递归和循环的优劣 介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归。 但是如果你打开一扇门后,同样发现前方也有一扇门,紧接着你又打开下一扇门.....但是却一直没有碰到尽头--这就是循环。 简单...

测试0901-1 985

4、多重循环、方法、递归作业

多重循环、方法、递归作业 一、选择题 分析下面的Java多重循环代码片段,编译运行后的输出结果是( D )。(选择一项) for (int i = 0; i < 6; i++) { int k = ++i; while (k < 5) { System.out.print(i); break; } } A. 024 B. 02 C. 123 D. 13 给定如下Java代码,编译运行的结果是( A )。(选择一项) public class Test { public

友培的博客 1860

java从入门到起飞(八)——循环和递归

循环是一种重复执行特定代码块的结构。在编程中,我们经常需要重复执行某些任务,这时循环就派上了用场。Java提供了for循环、while循环和do-while循环这三种主要的循环结构,用于重复执行特定的代码块。通过合理使用循环结构和循环控制语句,可以轻松处理重复性任务和大量数据的处理。在使用循环时,需要注意循环条件的设置和循环体内的代码逻辑,以避免出现无限循环或错误的运算结果。同时,要根据具体的需求选择合适的循环结构,提高代码的可读性和可维护性。希望本文对你理解和应用Java循环提供了一些帮助。​。

杨思默 6394
上一篇: 15个顶级Java多线程面试题及答案
下一篇: Java监视系统剪贴板
KingLearnJava
博客等级 码龄12年 93粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值