用递归算法画出该图形,递归方法的参数为left和right,第一次进入该程序时,left为0,right为宽度减1,即为15。
我想用数组来保存该图形,请哪位大哥指点如何实现
--------x-------
----x-------x---
--x---x---x---x-
-x-x-x-x-x-x-x-x
xxxxxxxxxxxxxxxx
我想用数组来保存该图形,请哪位大哥指点如何实现
--------x-------
----x-------x---
--x---x---x---x-
-x-x-x-x-x-x-x-x
xxxxxxxxxxxxxxxx
public class MapCreator{
public static void print(int left,int right){
int len =right-left+1;
int time =1;
while(len>0){
for(int n=0;n<time;n++){
int i =1;
for(;i<len/2+1;i++) System.out.print("-");
System.out.print("x");
for(;i<len;i++) System.out.print("-");
}
len /=2;
time *=2;
System.out.println();
}
}
public static void main(String[] args){
print(0,15);
}
}
public static StringBuffer func(int left, int right){
StringBuffer sb = new StringBuffer();
int n = (int)Math.pow(2, left);
int step = (int)Math.pow(2, (int)(Math.log(right)/Math.log(2)-left));
if(n > right)
return sb;
for(int i=0;i<=right;i++){
if(step == 1 || (i>0 && i % step ==0)){
sb.append('x');
} else {
sb.append('-');
}
}
sb.append('\n');
sb.append(func(left+1, right));
return sb;
}String result[] = func(0,15).toString().split("\\n");
我想知道这个怎么递归,有哪位能给出递归的算法?
其实根据left和right可以推算出来它的值,但是楼主的分给得比较少,只好留给楼主做啦,哈哈!public class TestDraw {
private char[][] result = {
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'}
};
/**
* @param args
*/
public static void main(String[] args) {
TestDraw td = new TestDraw();
td.draw(0,15,0);
for (int i=0; i<td.result.length; i++) {
System.out.println(td.result[i]);
}
}
private void draw(float left, float right, int layer) {
if (layer >= result.length) {
result[layer-1][0] = 'x';
return;
} else {
result[layer][Math.round((left+right)/2)] = 'x';
draw(left,Math.round((left+right)/2),layer+1);
draw(Math.round((left+right)/2),right,layer+1);
}
}
}
其实就是在两个参数的情况下,我不能很好的确定它的行数
我想了很久才搞定,跟wdman朋友的差别不大:
package src;
/*
* 用递归算法画出该图形,递归方法的参数为left和right,第一次进入该程序时,left为0,right为宽度减1,即为15。
*
--------x-------
----x-------x---
--x---x---x---x-
-x-x-x-x-x-x-x-x
xxxxxxxxxxxxxxxx
*/
public class Mymethod3 {
public static Integer layer=0,left=0,right=15;
public static char[][] str;
public static void rPrint(int l,int r,int t){
if(t>=layer)
str[t-1][0]='x';
else{
str[t][(l+r+1)/2]='x';
rPrint(l,(l+r+1)/2,t+1);
rPrint((l+r+1)/2,r,t+1);
}
}
public static int nLayer(int m){
int temp=0;
while(m!=0){
m=m/2;
++temp;
}
return temp;
}
public static void main(String[] agrs){
layer=nLayer(left+right)+1;
str=new char[layer][right+1];
for(int i=0;i<layer;i++)
for(int j=0;j<=right;j++)
str[i][j]='-';
rPrint(left,right,0);
for(int i=0;i<layer;i++){
System.out.print(str[i]);
System.out.print("\n");
}
}
}
if ((right == (result[0].length-1)) && (left != (result[0].length-1))) {
right++;
}
int diff = (int)(right - left);
int pow = result.length;
while (diff > 0) {
diff /= 2;
pow--;
}
return pow;
}
private void draw(float left, float right) {
int layer = getLayer(left,right);
if (layer >= (result.length-1)) {
result[layer][0] = 'x';
result[layer][result[0].length-1] = 'x';
}
result[layer][Math.round((left+right)/2)] = 'x';
if ((right - left) > 1) {
draw(left,Math.round((left+right)/2));
draw(Math.round((left+right)/2),right);
}
}