`
中南java人
  • 浏览: 6262 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

java递归浅谈

 
阅读更多
                      java之递归浅谈
    接触java一段时间了,在我揭开初始对我神秘的面纱之后,我逐渐明了java始终只是一门语言,一种工具,而真正在其身后的后盾是其逻辑思维,是imagination,是idea.之所以会有这样的想法是因为本人接触到了递归的灵活应用。然而提到递归就不能不提到分形,一个做游戏画面必不可少的元素。
    对于递归的定义,一句话简单来说就是为其自身调用自身的方法,抓住其每个变化的初始状态与末尾状态。以最简单的谢尔宾斯三角形为例.
其具体实现代码如下:
public class sanjiao {
//传画布
Graphics g ;
public sanjiao(Graphics g ){
this.g=g;

}
//写递归函数,注意参数最好为double或float,免得丢失精度
public void digui(double x1,double y1,double x2,double y2,int n){
//加个深度限定条件
if (n==0){return ;}
double x3=(x1+x2)/2,y3=(double)(y1-((x2-x1)/2*Math.sqrt(3)));
//画初始的三角形
g.drawLine((int)(x1+x3)/2,(int)(y1+y3)/2,(int)(x2+x3)/2,(int)(y2+y3)/2);
g.drawLine((int)(x1+x2)/2,(int)(y1+y2)/2,(int)(x2+x3)/2,(int)(y2+y3)/2);
g.drawLine((int)(x1+x3)/2,(int)(y1+y3)/2,(int)(x2+x1)/2,(int)(y2+y1)/2);
//调用三个本身的递归函数 注意深度为n-1
digui(x1,y1,(x1+x2)/2,(y1+y2)/2,n-1);
digui((x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,n-1);
digui((x1+x2)/2,(y1+y2)/2,x2,y2,n-1);


}
}
在这里我们不难看出递归的一般模块:public void digui(double  x1,x2, x3, y4,.....xn,int n(深度)){
       if (n==0){return ;}
//由初始参数导出一些必要参数
   double yn=....
//再画初始图形
    g.drawLine (......)
//调用本身递归 深度-1
  digui(xn...... n-1)}
以此模板再来对科赫曲线进行,首先对其算法进行分析 .其为一条线突出一个顶角
首先就自定义两条边的两个坐标,重点只是算出其顶角的坐标值
public class kech {
//传两个不同颜色的画布
Graphics g ;
Graphics g1 ;
public kech(Graphics g1,Graphics g ){
this.g=g;
this.g1=g1;

}
public void digui(int x1,int y1,int x2,int y2,int n){

if(n==0){return;}
//算三角形两个顶角的坐标
    int x3=(x2-x1)/3+x1;
int y3=(y2-y1)/3+y1;
int x4=2*(x2-x1)/3+x1;
int y4=2*(y2-y1)/3+y1;
//算其顶角的坐标
double x5=x1+(x2-x1)/3+((x2-x1)/3)*Math.cos(Math.PI/3)-((y2-y1)/3)*Math.sin(Math.PI/3);
double y5=y1+(y2-y1)/3+((x2-x1)/3)*Math.sin(Math.PI/3)+((y2-y1)/3)*Math.cos(Math.PI/3);



g1.drawLine(x3,y3,x4,y4);
g.drawLine(x1, y1, x3, y3);
g.drawLine((int)x5, (int)y5, x3, y3);
g.drawLine((int)x5, (int)y5, x4, y4);
g.drawLine(x4, y4, x2, y2);
//要对四条边分别进行递归
digui(x1,y1,x3,y3,n-1);
digui(x3,y3,(int)x5,(int)y5,n-1);
digui((int)x5,(int)y5,x4,y4,n-1);
digui(x4,y4,x2,y2,n-1);
    }




}




综上所言,递归要抓住其变化的本质,就是其第一次变化的初始状态与末尾状态。
分享到:
评论

相关推荐

    java递归算法浅谈

    Java 递归算法浅谈 Java 递归算法是 Java 编程中的一种常见算法,通过自调用函数实现复杂问题的解决。下面是 Java 递归算法的相关知识点。 一、递归函数的定义 递归函数是指在函数体内直接或间接地调用自己,即...

    浅谈Java中hashCode的正确求值方法

    浅谈Java中hashCode的正确求值方法 hashCode是一种常用的散列函数,在Java中它是一个对象的整数表示,用于标识对象的唯一性。在Java中,每个对象都有一个hashCode,这个hashCode可以通过hashCode()方法来获取。...

    浅谈Java泛型让声明方法返回子类型的方法

    总的来说,Java泛型的递归模式是一种强大的工具,它可以用于创建灵活的API,保证类型安全,并且允许在方法链式调用中返回子类型。在设计框架或复杂的组件时,理解并熟练运用泛型递归模式能显著提高代码的质量和可...

    浅谈Java的虚拟机结构以及虚拟机内存的优化

    理解栈的工作原理能帮助我们避免栈溢出,比如通过控制递归深度和循环次数。此外,了解垃圾回收机制让我们能更好地管理对象引用,适时释放不再需要的对象,避免内存泄漏。 总的来说,深入理解Java虚拟机的结构和内存...

    浅谈Java编程中的内存泄露情况

    线程栈溢出(StackOverflowError)则是由于递归深度过深或方法调用层次过多。 解决Java内存泄露的方法主要包括:合理地管理对象引用,避免长时间持有不再使用的对象;使用弱引用或软引用来缓存对象,以便GC能够适时...

    浅谈程序设计语言中四种语言范型的区别.pdf

    面向对象语言如Java、C++和Python提供了更高级别的抽象,提高了代码的重用性和可维护性,但执行效率相对较低。并发性支持良好,安全性能较高,比如通过垃圾回收机制减少悬挂指针的问题。面向对象语言的类型系统更加...

    浅谈LISP的二次开发在CAD中的应用.pdf

    LISP语言是一种专门用于人工智能领域的高级计算机编程语言,由于其是函数式编程语言,它与传统的命令式编程语言如B、C等,以及面向对象编程语言如Java、C++、C#等都有所不同。LISP语言具有弱类型、动态推断的特点,...

    浅谈javascript 函数内部属性

    这在递归函数或需要自我引用的情况下非常有用,比如阶乘函数的实现: ```javascript function Factorial(num) { if (num ) { return 1; } else { // 使用 arguments.callee 引用当前函数,即使函数名改变也不受...

    浅谈Linux环境下并发编程中C语言fork()函数的使用

    `fork()`创建子进程后,子进程会从`fork()`调用之后的指令开始执行,避免了无限递归创建子进程的问题,否则可能导致系统资源耗尽。 关于提供的代码示例,以下是一个简单的多进程创建的例子: ```c #include #...

    Python 核心编程 第二版

     6.20 *拷贝Python对象、浅拷贝和深拷贝   6.21 序列类型小结   6.22 练习   第7章 映像和集合类型   7.1 映射类型:字典   7.2 映射类型操作符   7.3 映射类型的内建函数和工厂函数   7.4 ...

    Python核心编程第二版

     6.20 *拷贝Python对象、浅拷贝和深拷贝   6.21 序列类型小结   6.22 练习   第7章 映像和集合类型   7.1 映射类型:字典   7.1.1 如何创建字典和给字典赋值   7.1.2 如何访问字典中的值   ...

Global site tag (gtag.js) - Google Analytics