Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包装递归函数总是一种好的做法吗?_Java_Function_Recursion_Wrapper - Fatal编程技术网

Java 包装递归函数总是一种好的做法吗?

Java 包装递归函数总是一种好的做法吗?,java,function,recursion,wrapper,Java,Function,Recursion,Wrapper,我使用一个递归函数来计算从一个节点开始到另一个给定规则集结束的图中可能的遍历次数(例如:最小/最大/精确的停止次数) 我想知道调用调用递归函数的包装函数而不是直接调用它是否是一种好的做法。大多数时候,我看到人们使用包装器函数 只是想知道为什么,利弊是什么,在什么情况下我们必须把它包装起来?不,这并不总是必要的。您只需要在有特定原因时包装它。以下是您可能需要包装它的几个原因: 如果它传递给自身的参数与它在初始调用中收到的参数不同,无论出于何种原因 可能递归参数很复杂,调用方很难为它们提供适当的

我使用一个递归函数来计算从一个节点开始到另一个给定规则集结束的图中可能的遍历次数(例如:最小/最大/精确的停止次数)

我想知道调用调用递归函数的包装函数而不是直接调用它是否是一种好的做法。大多数时候,我看到人们使用包装器函数


只是想知道为什么,利弊是什么,在什么情况下我们必须把它包装起来?

不,这并不总是必要的。您只需要在有特定原因时包装它。以下是您可能需要包装它的几个原因:

  • 如果它传递给自身的参数与它在初始调用中收到的参数不同,无论出于何种原因
    • 可能递归参数很复杂,调用方很难为它们提供适当的初始值
    • 也许初始参数与递归参数明显不同
  • 如果您需要起始位置(例如包装器)具有与递归方法本身不同的访问级别
可能还有几个


但是很多递归方法不需要包装。例如,带有谓词的经典深度优先节点遍历方法在递归期间与初始调用期间不需要传递任何特殊信息,因此无需对其进行包装。

递归函数通常需要一个表示上一次调用累积结果的参数。问题领域的一个假设例子是

public int numberOfPossibleTraversals(Node node, List<Rule> rules) { ...

有时(取决于具体实现),为累积参数建立起始值可能需要一些逻辑/处理。这就是“包装器”方法可能发挥作用的地方。例如,图形本身可能有这样一个包装器函数,它为递归函数构建参数

您不必提供“包装器”方法,但在许多情况下,递归方法需要一些递归设置,调用方不必担心这些设置,因此“包装器”方法提供了一个简单的入口点。例如,可以采用递归快速排序方法,该方法可能具有签名
排序(左、右)
。由于大多数时候您只想对所有内容进行排序,因此入口点是“包装器”方法
sort()
,它通过
sort(0,size-1)
在内部启动递归。好了,包装器通常用于减少“实际”递归方法的参数。如果参数数量较少(对于意义较小的ymmv),则可直接使用该方法。好问题+1
int c = numberOfPossibleTraversals(root, rules);