是否可以通过java的辅助函数保留信息,而不使用静态变量.
例如,
public void foo(){
int v = 0;
fooHelper(2);
}
public void fooHelper(int depth){
v++;
fooHelper(depth-1)
}
Run Code Online (Sandbox Code Playgroud)
即我想更新变量v而不丢失每个递归情况的信息,而不必访问函数外部的变量.
Ósc*_*pez 28
忘记告诉您声明属性的所有答案,或者在每次递归调用中更新可变对象.在真正的函数式递归样式中,通过将其作为参数和/或返回类型传递来"保留"信息.
让我用一个简单的例子来说明,假设你想要递归地计算一个元素的总和int[].这里,状态(需要在递归调用之间保留的信息)是数组中的当前索引和到目前为止的总和.这是怎么做的:
public int sum(int[] array) {
return sum(array, 0, 0);
}
private int sum(int[] array, int idx, int acc) {
if (idx == array.length)
return acc;
return sum(array, idx+1, acc+array[idx]);
}
Run Code Online (Sandbox Code Playgroud)
像这样称呼它:
int[] array = {1, 2, 3};
System.out.println(sum(array));
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,不需要声明(静态或实例)属性,也不需要传递和修改可变对象(列表,映射) - 我甚至不使用局部变量,因为解决问题所需的所有必需信息问题作为方法参数存在.
在您的问题中的代码中,v变量应该acc在我的答案中执行参数所做的操作,即:每次调用递归时修改累积值.最后,您只需要从辅助函数(不能有void返回类型)返回累计值,这就是您获取值的方式foo().
| 归档时间: |
|
| 查看次数: |
27005 次 |
| 最近记录: |