我正在尝试学习递归,但我根本不理解它。 有人可以告诉我示例代码来构建这样的树吗?我觉得它有助于看到图形递归
假设有一个包含顶部和底部x和y坐标参数的线方法,我将如何解决这个问题?
谢谢!还有关于递归的任何推荐教程等吗?
答案 0 :(得分:1)
当然,有许多不同的方法可以递归地实现这一点 - 这是其中之一:
public void drawTree(Graphics g, int x, int y, int arity, int depth) {
if (depth > 0) {
int childDistanceX = (int) (Math.pow(arity, depth) * DISTANCE_X);
int childX = x - (arity - 1) * childDistanceX / 2;
int childY = y - DISTANCE_Y;
for (int child = 0; child < arity; child++) {
g.drawLine(x, y, childX, childY);
drawTree(g, childX, childY, arity, depth - 1);
childX += childDistanceX;
}
}
}
给定根节点的x,y
坐标,树的子节点数(arity
)和depth
,此方法首先计算基于子节点的子节点之间的水平距离在常量DISTANCE_X
上,这是叶节点之间的水平间隙。
利用这些信息,以及第二个常量DISTANCE_Y
,它给出树的不同层之间的垂直距离,我们可以计算根节点左侧的x,y
位置 - 大多数孩子。
然后,只需迭代所有子节点并从根到孩子绘制一条线。这也是递归发挥作用的地方:我们递归地调用该方法,但每次当前子进程都成为新的根。另请注意,由子节点控制的子树的深度比其父节点的深度小1,因此我们在递归调用中传递depth - 1
。
你可以通过copy&amp; amp;把它粘贴到下面的课程中:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TreeTest extends JPanel {
private static final int DISTANCE_X = 4;
private static final int DISTANCE_Y = 60;
private int treeArity = 3;
private int treeDepth = 3;
public void paintComponent(Graphics g) {
Dimension size = getSize();
int x = size.width / 2;
int y = (size.height + treeDepth * DISTANCE_Y) / 2;
drawTree(g, x, y, treeArity, treeDepth);
}
public static void main(String[] args) throws Exception {
TreeTest main = new TreeTest();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(main);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}