C++两个函数可以相互递归吗_Java利用递归与分形画一些复杂有规律的图形

首先来了解一下递归,递归(Recursion)是指在函数的定义中使用函数自身的方法。递归有三个要素,(1)是有一个递归的终止条件,有点像while中的条件,(2)是给出递归终止时的处理办法,即要执行什么样的语句。(3)是复杂的逻辑简单化,重复繁杂的操作可以用递归去完成,缩短代码量。那递归能实现什么功能呢?比如这么一个谢尔宾斯基三角形

6264c415f76188c753f84ffba441a730.png

我们是不是一个一个地去画三角形呢,答案是否定的,计算机能帮我们去完成一些重复繁杂的操作,而我们只需要给出公式并且设定它的循环次数就行了。那这里就要用到递归了,怎么去实现它呢?接下来我将会一步步讲解。

首先我们仍然希望通过在面板上一个按钮就可以实现画出一个谢尔宾斯基三角形,具体操作就是在在窗体JFrame中添加按钮JButton并且按钮安装ActionListener动作监听器,并且将监听器对象传递到监听器类中,这个我们前面已经讲解过,现在只是重复了一遍。接下来讲解递归

if

这里的操作是如果按钮上的字符串等于“三角形”时执行下面的triangle方法,就是判断按钮按下然后画出图形,这里括号内有五个参数,第一个是n即循环的次数递归调用的次数,第二个x0和第三个y0是三角形顶点的横坐标和纵坐标,第四个dx和第五个dy是三角形的底部的点到顶点的x轴距离和y轴距离。就是可以用顶点坐标(x0,y0)和dx,dy来确定底边两个点的坐标。比如底下左边的点可以表示为(x0-dx,y0+dy),底下右边的点可以表示为(x0+dx,y0+dy),下面给出详细的代码:

public  

递归的第(1)(2)要点,递归的终止条件和终止后进行的处理,就是上面代码中的

if(n==0)
return;

意思是当n的值为0时返回。第(3)点就是缩短代码,复杂逻辑简单化,那怎么实现的呢,我们接下来就进行分析,设顶点为a,底下左边的的为b,右边的点为c。

第一次画的图形是外边一个大的三角形和中心倒置的三角形,如下图:

a974366fad149675ed36818dc2e9cc6f.png

画法就是a(x0,y0),b(m1,n1),c(m2,n2)三点连线。然后内三角形的坐标也可以得出,左上角的点坐标((x0+m1)/2,(n1+y0)/2),右上角的点坐标 ((x0+m2)/2,(n1+y0)/2),底边中点的坐标((m1+m2)/2,n1)。然后就内三角形的三个点连接起来画线就可以得到这么一个图形。然后接下来怎么做呢?

试想我们是不是可以通过改变顶点坐标来画下一组图形呢?既然左下角和右下角的点由顶点坐标(x0,y0)加减dx,dy得来,而内三角形的坐标也是由顶点和左右下角的坐标得来,那么我们将顶点坐标移到内三角形左上角的点上,不就可以在左下角这个三角形中再画一个同样的图形,大小我们可以改变一下,将每次调用的x0=x0/2,y0=y0/2,dx=dx/2,dy=dy/2,这么去实现它,顶点坐标就改成x0=(x0+m1)/2,y0=(y0+n1)/2。会变成什么样的图形呢?我们来看看

0eedf0395e4509957a6581b7f007da4f.png

果然跟我们想的差不多,递归调用的次数是6次,

triangle(n-1,(x0+m1)/2,(y0+n1)/2,dx/2,dy/2); //递归调用函数

那同理可以画出右边和上边的三角形,右边三角形的调用递归函数是:

triangle(n-1,(x0+m2)/2,(y0+n1)/2,dx/2,dy/2); //顶点变成((x0+m2)/2,(y0+n1)/2)

上边三角形的调用递归函数是:

triangle(n-1,x0,y0,dx/2,dy/2); //顶点不变(x0,y0)

画出来的图形如下图:这就是谢尔宾斯基三角形。

e9fcb06cb954e224783bdb8bef4827a7.png

那接下来我们来理解一下分形

迭代分型中的一组公式

0b65c327b7bbd75b3929da56e02e630e.png

如下代码绘制一组图形

public 

就会得到这么一个图形

08a04d8d07712c93dfb440803bd3f81e.png

它是通过一个一个点迭代起来得到的图形,一共执行25000次,通过更改a,b,c,d4个常量的值得到不同的图案,大家可以尝试一下更改这些值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值