如何保持一种"做事情"数在递归算法在Java?
-
09-06-2019 - |
题
我已经递归算法哪些步骤通过一串,逐字符,并分析它来创建一个树形结构。我希望能够跟踪的角色指数的分析程序目前的(对错误信息,如其他任何东西)但我并不热衷于实施喜欢的东西一元组处理多返回的类型。
我试图采用一整数类型,声明之外的方法,并通过进入递归的方法,但因为它是最终的,递归呼吁增量"被遗忘的"当我返回。(因为增加整数值,使得通过-通过价值的对象,参考点的新对象)
有没有办法得到一些类似的工作,这不会污染我的代码?
解决方案
因为你已经发现的伪变整数"哈克,"这个怎么样的选择:
这会让你感觉做一个单独的分析器类?如果你这样做,你可以储存的当前状态中的一个成员的变量。你可能需要考虑如何你要去处理任何线的安全问题,它可能会被矫枉过正,为此尤其应用,但它可能会对你的工作。
其他提示
这是一种黑客,但是有时候我使用一个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;
}
这是很难知道是否将帮助不知道更多关于如何你的算法的实际工作。