当前位置: 首页 > 面试题库 >

Java在递归函数中保留信息

廉雅惠
2023-03-14
问题内容

是否可以通过java的辅助函数保留信息,而无需使用静态变量。

例如,

public void foo(){
    int v = 0;
    fooHelper(2);
}

public void fooHelper(int depth){
    v++;
    fooHelper(depth-1)
}

也就是说,我想更新变量v而不丢失每个递归情况的信息,而不必访问函数外部的变量。


问题答案:

忘记所有告诉您声明属性或在每次递归调用中更新可变对象的答案。在真正的功能性递归样式中,您可以通过将信息作为参数和/或返回类型传递来“保留”信息。

让我用一个简单的示例进行说明,假设您要递归地计算中的元素之和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]);
}

这样称呼它:

int[] array = {1, 2, 3};
System.out.println(sum(array));

如您所见,无需声明(静态或实例)属性,也无需传递和修改可变对象(列表,地图)-我什至不使用局部变量,因为解决该问题所需的所有必需信息问题作为方法参数存在。

在您问题的代码中,v变量应该acc执行我的答案中参数的作用,即:每次调用递归时都修改累加值。最后,您只需要从helper函数(不得具有void返回类型)中返回累积值,这就是在中获取值的方式foo()



 类似资料:
  • 我还不太理解递归,我有一些作业我不能解决。有人有主意吗? 任务1:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • 考虑这段代码(引用自geeksforgeeks.org,作者Tushar Roy),如果从根到叶的路径具有总和为指定值的键,它会计算true或false: 在这段代码中,作者在对变量ans的赋值中使用了逻辑OR运算符,以避免用false覆盖true返回。我已将代码重构为: 尽管在这种情况下使用临时变量和/或逻辑OR运算符显然可以有效地防止递归返回的覆盖,但在递归调用中携带值的最佳方法是什么? 编辑

  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times n