递归是什么?在说此之前,我先讲个故事吧,话说从前有座山,山上有个庙,庙里有个老和尚,老和尚在讲从前有座山,山上有个庙,庙里有个老和尚,老和尚在讲从前...............这就是递归,在自己的方法里不断的调用自己。那我们怎么实现这个递归呢?
首先,我们要声明老和尚这个对象
然后,写出讲故事这个方法
最后在这个方法中调用讲故事这个方法来使老和尚不停讲故事就行了!
上例只是简单地比喻,现在我们一起用递归方法做一个漂亮的图形吧!
首先做个画板
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); } }
总结:以不变应万变
递归思想总的来说,就是传参和确定你所递归的方法。
相关推荐
所谓递归,就是逐层求解母问题的子问题。重点是设置递归边界和递归式。 简单举个栗子(即经典例题的第一道): 求f(n) = 1+2+3+4+5+6+7+….n; 子问题是求解f(n – 1), 即f(n) = n + f(n – 1) 同理f(n – 1) = n –...
在编程中,栈常用于存储函数调用的信息,这就是所谓的“调用栈”。当函数调用另一个函数时,原始函数的状态被保存在栈上,直到被调用的函数返回。 而递归(Recursion)则是一种函数自我调用的技术。在递归过程中,...
Python支持函数的递归调用,所谓递归就是函数直接或间接地调用其本身。;;所谓局部变量,指的是定义在函数内的变量,只能在函数内使用,它与函数外具有相同名称的其他变量没有任何关系。不同函数中,可以使用相同名字...
当函数调用自身时,系统会在栈中为每个新函数调用分配一块区域来保存返回地址、局部变量等信息,这就是所谓的"调用堆栈"。每次递归调用都会将新的信息压入栈顶,而递归结束时,信息会被弹出栈,返回到上一级调用,...
这种自我调用的过程会不断缩小问题规模,直到达到一个基础情况,即所谓的“基本情况”或“边界条件”,这个条件可以直接给出答案,无需进一步的递归调用。 例如,阶乘数列是一个经典的递归应用案例。要计算一个数的...
这个过程形成所谓的“调用栈”,新调用的函数位于栈顶。递归终止于基本情况,然后逐层返回,恢复之前的函数状态,直至栈顶函数完成执行。 3. **C语言中的递归实现** 在C语言中,递归函数与其他函数并无本质区别,...
所谓递归,是指一种在解决问题时,自己调用自己的方法。在这个工具中,它能够通过编程技术自动访问百度网盘中的分享链接,深度扫描链接内的所有文件,根据文件的原始存储结构,创建相对应的文件夹,并将文件保存到...
这种策略的关键在于存在一个终止条件,即所谓的递归基,以防止无限循环。 在提供的代码示例中,有两个使用递归的例子: 1. `multiply` 方法实现了计算阶乘的功能。阶乘是数学中的一个函数,表示所有小于等于给定正...
递归实现十进制数从高位到低位依次输出 主要是我对递归算法的初步理解后试手制作希望对你有用
在计算机程序中,栈常用于存储函数调用的信息,即所谓的“调用堆栈”。每当一个函数被调用,它的返回地址、局部变量等信息会被压入栈中。当函数执行完毕,这些信息会被弹出,程序返回到上一层调用者。这种机制使得...
最后,将四个结果组合成最终的矩阵C,这就是所谓的Strassen算法或分治策略的一种应用。 在代码实现中,可能会遇到内存管理的问题,比如使用`new`关键字动态分配内存。在C++中,`new`用于在堆上分配对象,这与在栈上...
斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo Fibonacci,斐波那契数列的定义很简单,用数学函数可表示为: ...所谓递归就是指函数的定义中
这就是所谓的"调用堆栈"。在递归中,每次递归调用都会将新的函数状态压入栈,直到递归结束,然后逐个弹出恢复之前的函数状态,这称为"回溯"。 在"飞行里程"的例子中,如果我们试图基于这个属性来划分数据集,可能会...
然而,递归方法存在性能问题,因为很多子问题会被重复计算多次,这就是所谓的“重叠子问题”。为了简单起见,压缩包文件先展示基本的递归实现,然后再提供一个优化后的版本(使用记忆化技术)。
- **递归出口的设计**:递归必须有终止条件,即所谓的递归出口,防止无限循环。在阶乘问题中,递归出口是当 \(n=0\) 或 \(n=1\) 时,直接返回 \(1\)。 ### 递归的优缺点 #### 优点 - **代码简洁性**:递归算法...
这个过程就是所谓的“回溯”或“反向执行”。 需要注意的是,递归虽然简洁,但也可能导致性能问题,因为它会产生大量的方法调用,占用内存的调用栈空间。如果递归深度过大,可能会导致栈溢出错误。因此,编写递归...
这个程序中,当`N=0`时,递归终止,因为0的阶乘被定义为1,这就是所谓的边界条件。在递归调用过程中,系统使用递归工作栈保存中间结果,直到达到边界条件,然后逐步恢复并返回结果。 递归的特点包括: 1. 自身调用...
这里的L指的是滤波器的阶数,C是所谓的折叠因子。例如,一个1/2的递归折叠结构意味着用一半数量的抽头实现完整的匹配滤波。这种结构的实现依赖于递归延迟线,它使抽头的样本输出速率提高C倍,同时使乘法器和加法器的...
所谓的“无限级”意味着系统能够处理任意层级的分类,而且每一个分类节点理论上可以拥有无限多的子节点。在PHP中实现无限级分类查询,主要分为递归法和非递归法(通常使用栈结构)两种处理方式。 递归法是处理...
词法分析,又称为扫描或标记,是编译器的第一个阶段,它将源代码分解成一系列的词汇单元,即所谓的“标记”或“Token”。这些标记代表了语言的基本元素,如标识符、关键字、常量、运算符等。词法分析器通常由正则...