递归出来的美丽分形世界
?
毕达哥拉斯树:爱情电影中都有那么一种场景,一望无际的草地中央坐落着一棵参天古树,树下的男女主角背靠着古树,祈祷一辈子的幸福
?
今天的重点:科赫曲线
基本样板:
1次迭代
?2次迭代:
?
?细心的你也许可以从上面看出规律了,下面是主要代码实现:
/** * 字符串递归得到一个新字符串 * @param s 原字符串 * @param DGs 递归原则字符串 * @return */public String DG(String s,String DGs){String newString;if(count==0){return s;}if(s==""){newString = "F";//System.out.println("newString: "+newString);}else{char[] ch=s.toCharArray();char[] DGch=DGs.toCharArray();//System.out.println("ch的个数:"+ch.length);//System.out.println("DGch的个数:"+DGch.length);int countF=0;int countOthers=0;//统计字符串的f和+-的个数for(int i=0;i<ch.length;i++){if(ch[i]=='F'){countF++;}else{countOthers++;}}//System.out.println("F的个数:"+countF);//System.out.println("+-的个数:"+countOthers);//生成新字符数组char[] newCh=new char[DGch.length*countF+countOthers];//System.out.println("新数组长度:"+(DGch.length*countF+countOthers));int nPos=0;for(int i=0;i<ch.length;i++){if(ch[i]=='F'){//将递归字符串放到新串中for(int j=0;j<DGch.length;j++){newCh[nPos]=DGch[j];nPos++;}}else{newCh[nPos]=ch[i];nPos++;}}//System.out.println("nPos的大小:"+nPos);//将数组转换成字符串返回newString = new String(newCh);}//System.out.println("newString: "+newString);count--;newString=DG(newString,DGs);return newString;}
原字符串代表初始字符串,可以是空,然后是递归原则字符就是“F”->"F-F++F-F",然后依次用这个原则递归不同代数就可以得到新生代字符串,在自己定义每个字符的意义,比如科赫曲线意义:F代表向前画一根线,“-”代表逆时针旋转60度,“+”代表顺时针旋转120度,所以“F”就是上面1次迭代图,“F-F++F-F”是上面的2次迭代图,而我们可以改变“+”“-”所旋转角度,从而得到自由旋转的曲线,不多说,上图:
是不是很像细胞:
?
乌龟么?
?这是向日葵!
?? 不仅仅这些,改变角度还有很多很多的图案,自己去尝试尝试。。。
??? 我们还可以定义很多简单的样板和规律,比如树杈的递归,三叉递归出一棵枝叶茂密的大树等等等等,发挥你的想象,展现在你眼前的必然是一个美丽的分形世界。