Java 递归 : pass by reference

原文 标签 java pass-by-reference graph-theory pass-by-value

我意识到这对于 Java 程序员来说是一个激烈争论和有争议的话题,但我相信我的问题有点独特。我的算法 要求 通过引用传递。我正在对一般树(即 n-children)进行顺时针/逆时针预序遍历以分配虚拟 (x,y) 坐标。这只是意味着我在访问它们时计算(并标记)我访问的树的节点。

/**
 * Generates a "pre-ordered" list of the nodes contained in this object's subtree
 * Note: This is counterclockwise pre-order traversal
 * 
 * @param clockwise set to true for clockwise traversal and false for counterclockwise traversal
 * 
 * @return Iterator<Tree> list iterator
 */
public Iterator<Tree> PreOrder(boolean clockwise)
{
    LinkedList<Tree> list = new LinkedList<Tree>();
    if(!clockwise)
        PreOCC(this, list);
    else
        PreO(this,list);
    count = 0;
    return list.iterator();
}
private void PreOCC(Tree rt, LinkedList<Tree> list)
{
    list.add(rt);
    rt.setVirtual_y(count);
    count++;
    Iterator<Tree> ci = rt.ChildrenIterator();
    while(ci.hasNext())
        PreOCC(ci.next(), list);      
}
private void PreO(Tree rt, LinkedList<Tree> list, int count)
{
    list.add(rt);
    rt.setX_vcoordinate(count);
    Iterator<Tree> ci = rt.ReverseChildrenIterator();
    while(ci.hasNext())
        PreO(ci.next(), list, ++count);
}
这里我生成树的结构:
Tree root = new Tree(new Integer(0));
root.addChild(new Tree(new Integer(1), root));
root.addChild(new Tree(new Integer(2), root));
root.addChild(new Tree(new Integer(3), root));
Iterator<Tree> ci = root.ChildrenIterator();
ci.next();
Tree select = ci.next();
select.addChild(new Tree(new Integer(4), select));
select.addChild(new Tree(new Integer(5), select));
这是我打印节点遍历顺序及其分配给相应节点的坐标时的输出。0 3 2 5 4 10 1 2 3 4 30 1 2 4 5 30 1 2 3 4 3注意:前两行是顺时针预序遍历和x坐标的赋值。接下来的两行是逆时针预序遍历和它们的 y 坐标分配。
我的问题是如何让第二行阅读:0 1 2 3 4 5编辑 1:这是我用来打印我访问节点的顺序和我分配的坐标的代码。
Iterator<Tree> pre = root.PreOrder(true);
System.out.println("              \t");
while(pre.hasNext())
    System.out.print(pre.next() + "\t");
    
pre = root.PreOrder(true);
System.out.println();
System.out.println("x-coordinates:\t");
while(pre.hasNext())
System.out.print(pre.next().getVirtual_x() + "\t");
    
System.out.println();
System.out.println();
    
Iterator<Tree> preCC = root.PreOrder(false);
System.out.println("              \t");
while(preCC.hasNext())
    System.out.print(preCC.next() + "\t");
    
preCC = root.PreOrder(false);
System.out.println();
System.out.println("x-coordinates:\t");
while(preCC.hasNext())
System.out.print(preCC.next().getVirtual_y() + "\t");
这里还有一个引用,可以更好地解释 x,y 坐标。
顶点。顶点的 y 坐标。

Compute the counterclockwise pre-ordering of the vertices of T (the ordering are numbered from 0 to n − 1), use them as the x-coordinates for the vertices.

Compute the clockwise pre-ordering of the vertices of T (the ordering are numbered from 0 to n − 1), use them as the y-coordinates for the vertices.

最佳答案

Java 总是按值传递 - 对于原语和对象。它是为非基元传递的引用,因此您可以更改它们指向的对象的状态,但不能更改引用本身。

James Gosling 在“Java 编程语言”中:

"...There is exactly one parameter passing mode in Java - pass by value - and that keeps things simple. .."



我认为这是对此的最终权威。

I realize this is a hotly debated, controversial topic for Java programmers



不,没有辩论。这从 James Gosling 一开始就融入到语言中。如果你认为这是有争议的,那你可悲的是被迷惑了或无知。

关于Java 递归 : pass by reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060509/

相关文章:

c++ - 如何通过引用传递函数?

perl - Perl 中的六度 Kevin Bacon

algorithm - 确定哪一组边沿会导致负循环?

Java本地IP范围检测

java - 如何调用JSP页面查询?

java - 如何按日期对对象列表进行排序(java集合,List <Object>)

c++ - 通过值和引用传递指向函数的指针之间的区别

java - 在Eclipse中调试for循环的简便方法

unit-testing - 如何模拟具有多个 Ref 参数的方法

algorithm - 距离n * n矩阵的算法问题