java - 递归方法是否将类属性/数据字段作为参数?

标签 java recursion parameters static

这个问题是由 Stack Overflow 上的以下评论引起的:

Q: Why is recursive method usually static in Java?

Ans: Because a recursive method/algorithm is generally controlled solely by it's parameters and not by instance variables.Any method that does not rely on instance variables can (and probably should) be made static.

可以在类中定义许多其他方法,这些方法不受实例控制,而是由方法参数控制。一个简单的例子是,当从无参数构造函数创建的对象调用参数化方法时,该方法实际上由参数控制。

然后我发现只有一个可能的异常(exception):如果方法中的参数也恰好是类属性,那么该方法不能是静态的,因为属性根据每个实例而改变。这意味着递归方法永远不会采用属于类属性的参数。

如有错误,请指正。如果我是正确的,请给我一个例子。我引用的 Stack Overflow 帖子是 here.

最佳答案

如果方法不引用任何实例变量或方法,则可以将其设为静态。这并不意味着它应该是静态的(但这实际上并不在这个问题的范围内)。将该逻辑应用于递归方法可能会做出一些常见的假设,但其本身不一定正确。

常见的递归操作是迭代文件,例如:

doForEveryFile(File root)
{
  if (root.isFile()) do_something_with_that_file(root);
  else if (root.isDirectory())
  {
     for (File next_file : root.listFiles()) doForEveryFile(next_file);
  }
}

但是在这种情况下,如果 do_something_with_that_file() 是一个实例方法,那么递归方法仍然不能是静态的。如果它是静态的,那么这可能是静态递归方法。因此,即使对于这个简单的情况,也应该清楚递归本身并不是静态或非静态可能性的明确驱动因素。

我们还可以编写一个数学案例,版本一,静态:

// sum all numbers from one to our given value
class StaticRecursive {
  public static int sumTo(int max) { return recursiveSum(); }
  private static int recursiveSum(int currentSum, int currentValue, int max)
  {
    if (currentValue == max) return currentSum;
    else return recursiveSum(currentSum + currentValue, currentValue + 1, max);
  }
}

这完全是静态的。我可以这样写:

class InstanceRecursive {
  private int max;
  private int sum;
  public int sumTo(int max) {
    this.max = max;
    this.sum = 0;
    return recursiveSum(0);
  }
  public void recursiveSum(int currentValue)
  {
    if (currentValue == this.max) return;
    else {
      sum += currentValue;
      recursiveSum(currentValue + 1);
    }
  }

这两个基本上做同样的事情,一个没有实例变量,一个有实例变量。有什么不同?不多。实例版本将使用更少的堆栈空间,但仅此而已。

总之,静态与实例变量/方法引用有关(如果没有,它可能是静态的)。从哲学上讲,如果一个方法可以是静态的,为什么它是该类的一部分?递归可能是一个值得考虑的有趣案例,但是对于递归方法是否是静态的,没有什么特殊或具体的。

关于java - 递归方法是否将类属性/数据字段作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559060/

相关文章:

vba - 尝试使用 VBA 在 Access 中打开记录集时出现 "Too few parameters error"

java - 如何在我自己的类中处理 null 以避免 NullPointerException

java - 将 JavaRDD<List<String>> 转换为 JavaPairRDD<String, Integer>

php - 递归是否基本上到达 "stack"的底部然后反弹回来?

haskell - 什么是隐式递归?

java - ibatis 内联参数 order by 子句中带有 #

java - 特定字符串产生 StringOutOfBoundsException

Java:写入 Windows 临时目录中的 tempFile

javascript - 如何在没有尾调用优化的情况下用函数式编程替代方法替换 while 循环?

c# - 如何在C#中传递任意数量的参数