我已经递归算法哪些步骤通过一串,逐字符,并分析它来创建一个树形结构。我希望能够跟踪的角色指数的分析程序目前的(对错误信息,如其他任何东西)但我并不热衷于实施喜欢的东西一元组处理多返回的类型。

我试图采用一整数类型,声明之外的方法,并通过进入递归的方法,但因为它是最终的,递归呼吁增量"被遗忘的"当我返回。(因为增加整数值,使得通过-通过价值的对象,参考点的新对象)

有没有办法得到一些类似的工作,这不会污染我的代码?

有帮助吗?

解决方案

因为你已经发现的伪变整数"哈克,"这个怎么样的选择:

这会让你感觉做一个单独的分析器类?如果你这样做,你可以储存的当前状态中的一个成员的变量。你可能需要考虑如何你要去处理任何线的安全问题,它可能会被矫枉过正,为此尤其应用,但它可能会对你的工作。

其他提示

这是一种黑客,但是有时候我使用一个AtomicInteger,这是可变的,要做到这样的事情。我也看到的情况下,一个int[]的尺寸1是通过。

目前的解决方案我用的是:

int[] counter = {0};

然后传递归算法:

public List<Thing> doIt (String aString, int[] counter) { ... }

当我想要增加:

counter[0]++;

不是超级优雅,但它的工作原理...

整是不可改变的,这意味着当你把它作为一个参数,它创建了一个副本而不是参照同样的项目。(解释).

获得的行为,你要寻找的,你可以写你自己的类似整数仅可变的。然后,就把它传递归功能,它是增加内递归,并且当你再次访问它后递归结束它仍将保持其新的价值观。

编辑:注意使用一个int[]array是一种方法...在爪哇阵列也是通过参考,而不是复制等原语或不可改变的课程。

你可以只采用一个static int类变量得到增加每次你doIt方法。

你也可以做到:

private int recurse (int i) {

    if (someConditionkeepOnGoing) {
        i = recurse(i+1);
    }

    return i;
}

说实话我会重新编码的功能,以使这一线性的算法,使用一个循环。这样,你有没有机会跑出来的堆空间如果你是逐步通过一个非常大串。还有,你就不需要有额外的参数只是为了跟踪该计数。

这也可能会有结果的算法更快,因为它不需要做一个功能呼吁每一个角色。

当然,除非有特殊原因需要将递归的。

一种可能性我能想到的是存储在一个成员变量分类。这当然是假设的公众 doIt 方法仅由一个单一的线。

另一种选择是重构的公共方法调用一个私人助手的方法。私方法需要列表中作为一个参数和返回计数。例如:

public List<Thing> doIt(String aString) {
    List<Thing> list = new ArrayList<Thing>();
    int count = doItHelper(aString, list, 0);
    // ...
    return list;
}

private int doItHelper(String aString, List<Thing> list, int count) {
    // ...
    // do something that updates count
    count = doItHelper(aString, list, count);
    // ...
    return count;
}

这个假设你可以做的错误处理在公共 doIt 方法,因为 count 变量实际上并不是通过回到呼叫者。如果你需要做的,当然,你可以扔掉一个例外:

public List<Thing> doIt(String aString) throws SomeCustomException {
    List<Thing> list = new ArrayList<Thing>();
    int count = doItHelper(aString, list, 0);
    // ...
    if (someErrorOccurred) {
        throw new SomeCustomException("Error occurred at chracter index " + count, count);
    }
    return list;
}

这是很难知道是否将帮助不知道更多关于如何你的算法的实际工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top