所谓递归

递归是什么?天真在说此之前,我先讲个故事吧,话说从前有座山,山上有个庙,庙里有个老和尚,老和尚在讲从前有座山,山上有个庙,庙里有个老和尚,老和尚在讲从前...............这就是递归,在自己的方法里不断的调用自己。那我们怎么实现这个递归呢?

首先,我们要声明老和尚这个对象

然后,写出讲故事这个方法

最后在这个方法中调用讲故事这个方法来使老和尚不停讲故事就行了!

上例只是简单地比喻,现在我们一起用递归方法做一个漂亮的图形吧!

 

 

首先做个画板

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Border extends JFrame {
	

	public static void main(String[] args) {
		Border bd=new Border();
		bd.initUI();

	}
	public void initUI(){
		this.setBackground(Color.black);
		this.setSize(800,800);
		this.setDefaultCloseOperation(3);
		this.setLayout(new FlowLayout());
		JButton jb=new JButton("Draw");
		this.add(jb);
		this.setVisible(true);
		Graphics g=this.getGraphics();
		Draw dr= new Draw(g,(JFrame)this);
		jb.addActionListener(dr);
	}

}

 然后实现画图:

package Sameple0402;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

public class Draw implements ActionListener {
     private Graphics g;
     private JFrame jf;
     private int x1,y1,x2,y2,x3,y3;
     public Draw(Graphics g,JFrame jf){
    	 this.g=g;
    	 this.jf=jf;
     }
     public void actionPerformed(ActionEvent e) {
	 		String str=	e.getActionCommand();
	 		if(str.equals("Draw")){
                //画出外面不变的大三角形
	 			x1=200;
	 			y1=200;
	 			x2 = x1 + 500;
	 			y2 = y1;
	 			x3 = (int) (x1 + (x2 - x1) / 2);
	 			y3 = (int) (y1 + (x2 - x1) * Math.sqrt(3) / 2);
                g.drawLine(x1, y1, x2, y2);
                g.drawLine(x1, y1, x3, y3);
		g.drawLine(x2, y2, x3, y3);


			 DrawArc(x1,y1,x2,y2,x3,y3);
				 			
	 		}
		
		}

     写出画出内部三角形的方法:
    	public void DrawArc(int x1,int y1,int x2,int y2,int x3,int y3){
    		
    	//定义出结束循环的条件	
    		
       if((x2-x1)<30) return ;
				int a1 = (x2 +x1) / 2;
	    int b1 = y1;
		int a2 =  (x3 + x1) / 2;
		int b2=(y1+y3)/2;
		int a3=(x2+x3)/2;
		int b3=(y2+y3)/2;
				g.drawLine(a1, b1, a2, b2);
		g.drawLine(a1, b1, a3, b3);
		g.drawLine(a2, b2, a3, b3);
//在方法内部调用自己的方法以实现循环
        DrawArc(x1,y1,a1,b1,a2,b2);
        DrawArc(a1,b1,x2,y2,a3,b3);
        DrawArc(a2,b2,a3,b3,x3,y3);
        

	   	
	}
    	 
	
		

}

 总结:以不变应万变

递归思想总的来说,就是传参和确定你所递归的方法。

 

 

浅谈普通递归和尾递归 [举例(计算阶乘)] #include<stdio.h> /* 用尾递归思想计算阶乘 */ unsigned long Fact(unsigned int n, unsigned long a) { if(n == 0 || n == 1) { return a; } else { a = a * n; return Fact(n - 1, a); } } /* */ int main()... 阅读详情

相关推荐

如何理解Fourier Neural Operator (FNO)

2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了更好的理解模型的理论基础,可以详细学习一下以及他的前期工作GNOFNO作者对这两篇文章的解析blog。

momo的博客 1万+

递归详解——让你真正明白递归的含义

让天下没有难学的程序(只有秃头的程序员 2333),学会程序和算法,走遍天下都不怕! 今天呢我们来讲一下非常有用也非常令人费解的算法——递归! Oh my god 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,..

青春无问西东 岁月自成芳华 12万+

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 597

Ackerman的递归与非递归算法

已知Ackerman函数的定义如下: akm(m,n)=⎧⎩⎨n+1,akm(m−1,1),akm(m−1,akm(m,n−1)),m = 0m≠0,n=0m≠0,n≠0akm(m,n)= \begin{cases} n+1, & \text{m = 0} \\ akm(m-1,1),& m \neq 0, \, n = 0 \\ akm(m-1,akm(m,n-1)),& m \ne

sanqima的专栏 1万+

华为AC外置Portal认证方案配置步骤指南

华为AC外置Portal认证方案配置步骤指南

m0_46129105的博客 7687

Hermes深入理解及源码解析(二):Hermes的记忆机制

源码位置:tools/memory_tool.py存储内容为两个文件,放在 ~/.hermes/memories/:MEMORY.md:Agent 自己的笔记(环境事实、项目约定、工具坑、学到的东西)—— 上限 2200 字符USER.md:关于用户的画像(角色、偏好、沟通风格)—— 上限 1375 字符作为一个独立的工具注册在系统中(为了让智能体正确使用它,System Prompt()中明确下达了禁令存储目标存储位置数据类型持久偏好/事实MEMORY.md我是谁、我喜欢什么、环境配置。

qq_41984117的博客 561

【算法】递归:递归优化之尾递归

文章首先会先通过斐波那契数列来复习在以往介绍的解决递归的方法,然后在通过这个例子去分析递归法的不足之处,最后将会介绍一下关于递归的优化策略,并举例实现。

qq_66725576的博客 4967

ardupilot 方向余弦矩阵/旋转矩阵的理解

本节主要记录自己对ardupilot中用到的方向余弦矩阵/旋转矩阵的理解,欢迎批评指正,有些资料参考网上写的比较好的资料,免得查找资料麻烦。旋转矩阵的坐标理解:表示从旋转矩阵的下标的坐标系的坐标变换到上标表示的坐标系坐标下。旋转矩阵的坐标系理解:表示从旋转矩阵的上标的坐标系变换到下标表示的坐标系下。从旋转矩阵的投影更好理解,比如下面旋转矩阵的第一行是左边坐标系的第一维分量在右边坐标系的投影。

陌城烟雨 612

将递归函数转换为非递归形式

任何递归函数转换为非递归函数有一套固定的规则,使用该规则可以将任何递归函数转换为非递归函数。

sunny_ss12的专栏 1万+

LeRobot 入门教程(三)在仿真环境和自定义机器人上部署 LeRobot

本教程详细介绍了基于真实世界机器人和仿真环境的模仿学习实现方法,涵盖数据采集、训练策略和评估全流程。在真实机器人部分,重点讲解了远程操作设置、摄像头配置、数据集记录与管理技巧、策略训练(支持GPU/MPS设备)以及模型评估。仿真环境部分则演示了gym-hil的安装使用、模拟数据采集和策略训练。此外,教程还提供了自定义机器人集成指南,包括电机选择、接口继承、传感器/动作特征定义、连接管理和校准配置等核心步骤。所有方法均支持HuggingFace数据集中心和Weights & Biases工具链,为机器

2506_90492529的博客 2402

基于YOLOv26的智能农业无人机巡检系统

本文提出了一种基于YOLOv26的智能农业无人机巡检系统。系统采用模块化设计,包含数据采集、预处理、目标检测、图像拼接、分析决策和部署控制六大核心模块。无人机搭载多光谱相机、RGB相机和热红外相机进行农田数据采集,通过YOLOv26实现作物病虫害、杂草及灌溉设备的检测。系统采用PyTorch、OpenCV等技术栈,支持无人机自动路径规划和多传感器数据采集,并包含数据增强和预处理功能。该系统可有效提升农业巡检效率,为精准农业提供智能化解决方案。

一键难忘的博客 809

递归算法与非递归算法比较

转载自:https://blog.youkuaiyun.com/mhsszm/article/details/78445591 非递归效率高;递归代码写出来思路清晰,可读性强。 生成可执行文件大小应该和编译器有关吧。。。。 递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。 以二叉树搜索为例: bool search(btree* p, int v) { if (null ...

u013073067的博客 1万+

【OpenFOAM】-olaFlow-算例10-wavemakerTank

采用 Flap和Piston两种方式的动网格进行造波

ou_no的博客 2169

递归?何为递归

递归算法是一种直接或间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解.   递归的分类:     递归分为两种,直接递归和间接递归。     直接递归称为方法自身调用自己。     间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。     for循环实现99乘法表 public class test99 { public static void main( String[] args ) { ...

u012343977的博客 1789

lwip-2.0.3

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

递归与间接递归

1. 介绍 递归技术允许我们将原问题分解为一个或多个形式上相似的子问题   2. 例子:级数 级数(n!)的定义如下:    n! = 1 * 2 * 3 * .... * (n-2) * (n-1) * n 可以根据定义写出如下迭代形式的实现 int fact(int n) {    int i;    int result;       result = ...

java的天空 4494

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

对递归的理解以及怎么写递归程序

1.一定要搞清楚当前你的递归程序的功能是什么,以及需不需要返回值,如果需要,则返回的值是什么,如果对当前递归程序要完成的功能模棱两可、一知半解,那么逻辑肯定混乱,也就不容易写出正确的递归程序。 2.找递归终止条件,根据函数的参数来看,看参数怎么样的时候是到了递归出口,注意:这种递归终止情况是由:1.这个递归程序解决的就是一个终止条件,比如斐波那契就是为了算n=1或者2。2这个终止情况是由上...

xiaohuihui1994的博客 6455

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

递归——线性递归与二分递归

递归线性递归例子1:数组求和int sum( int A[], int n) { //数组求和算法:线性递归版 if ( 1 &gt; n ) //平凡情况,递归基 return 0; //直接计算 else //一般情况 return sum(A, n-1) + A[n - 1]; //递归:前n-1项之和,再累计第n-1项 }每一递归实例对自身的调用至多一次。于是,每...

amoscykl的博客 5044

递归算法和尾递归

递归算法和尾递归

Charge8的博客 1709

递归与非递归

一、什么是递归很多数据结构的定义都是根据递归性质来进行定义的,是因为这些结构固有的性质。递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了。二、递归的几个特点1.递归式,就是如何将原问题划分成子问题。2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口。3.界函数,问

ldong2007的专栏 2270

递归 递归 递归 —深入浅出

递归是种思想,不是算法。一个算法,你用递归去实现,它就是递归算法;你用循环去实现,它就是非递归算法。递归与循环一一对应,大多数编程语言都支持循环,但不一定支持递归。一个大问题,分解成类似的小问题,递归只用一句话就能描述这些“重复工作”,代码那叫一个简单!想想这句话的威力都觉得很牛B!递归算法简单而又经典的例子有:n!、Fibonacci、Hanoi、回溯、树遍历、图搜索。敲代码的时候,

小北的家 6784

递归与非递归 python

面试题中很多都涉及到递归与非递归,比如二分法,冒泡,归并,快排,二叉树前中后遍历等等,建议能直接给出非递归形式,如果面试官想要看到递归形式也能熟练的写出来。 典型的面试题比如说:汉诺塔问题,斐波那契数列等 递归是什么?和循环的区别 答: 递归从字面意思理解是自己调用自己,实际上递归是将问题逐渐分解减小,但是和原问题有着相同解法的问题,并且存在一个问题的出口。 循环就是重复执行同一段代码 打一个比方吧,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有

文选的blog 1901

递归与非递归算法

一、原因:递归算法一般效率更低;有些程序语言不支持递归。 二、方法:将递归算法转换为非递归算法有两种方法,一种是直接求值,不需要回溯;另一种是不能直接求值,需要回溯。前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结果,称为间接转换法,下面分别讨论这两种方法。 直接转换法 直接转换法通常用来消除尾递归和单向递归,将递归结构用循环结构来替代。 尾递归是指在递归算法中,递归调用语句只有一个,而且是处在算法的最后。例如求阶乘的递归算法: long fact(int n) {   if(n0)

qq_44650782的博客 3361

什么是递归?递归有哪些常见应用?

选择递归还是迭代应根据具体问题的需求和资源限制来决定。如果问题可以分解为多个相似子问题,且注重代码的简洁性和可读性,递归可能是更好的选择。然而,在追求高效运行和处理大量数据时,迭代通常更为适用。

破损的天堂鸟博客 1983

【递归详解】递归的效率问题及递归与循环比较

目录 1.何为递归 2.递归算法设计的基本思想是: 3.常见递归算法 (1)最常见的就是阶乘,比如求5的阶乘,数学公式就是:5*4*3*2*1 (2)求1+2+3+4+5+6+7……+1000的和 (3)1,1,2,3,5,8,13,21,34...,求用递归算第30个数 (4)用递归方式实现 99乘法表 4.递归的效率问题及递归与循环比较 1.所谓的递归慢到底是什么原因呢? 2.用循环效率会比递归效率高吗? 2.1递归算法: 2.2循环算法: ...

qq_50864729的博客 4665

递归之原理及汉罗塔的递归与非递归实现

递归章节 一.什么是递归 递归:简单的讲,就是定义一个过程或函数时出现调用本过程或本函数就称为递归。 典型的例子: 求阶乘: int fun(int n) { if(n == 1) return(1); else return fun(n*fun(n - 1)); } 二.那么使用递归需要满足那些条件呢? (1) 从上例就可以看出,递归需要终止递归的结束条件。 (2)...

Jhze 1816

递归与非递归之间的比较

递归与非递归之间的比较

醉蕤的博客 2962
上一篇: java事件监听器
下一篇: 数组队列 的简单实现
rootke
博客等级 码龄12年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值