包装递归函数总是一个好习惯吗?
Is it always a good practice to wrap a recursive function?
我正在使用递归函数来计算从一个节点开始到另一个给定一组规则(例如:minimum/maximum/exact 停靠点数)的图形可能遍历的次数。
我想知道调用递归函数而不是直接调用它的包装函数是否是一个好习惯。大多数时候我看到人们使用包装函数。
只是想知道为什么以及优缺点是什么以及在什么情况下我们必须包装它?
不,这并不总是必要的。只有在有特定原因时才需要包装它。以下是您可能需要包装它的几个原因:
- 如果它传递给自己的参数与它在初始调用中收到的参数不同,无论出于何种原因
- 也许递归参数很复杂,调用者很难为它们提供适当的初始值
- 也许初始参数与递归参数明显不同
- 如果您需要起始位置(例如包装器)具有与递归方法本身不同的访问级别。
可能还有几个。
但是很多递归方法不需要换行。例如,带有谓词的经典深度优先节点遍历方法不需要在递归期间与初始调用期间传递任何特殊内容,因此无需包装它。
递归函数通常需要一个参数来表示先前调用的累积结果。问题域中的一个假设示例是
public int numberOfPossibleTraversals(Node node, List<Rule> rules) { ...
所以每次递归调用都会修改第一个参数。您使用这样的起始值开始调用链
int c = numberOfPossibleTraversals(root, rules);
有时(取决于具体实现)为累积参数建立初始值可能需要一些 logic/processing。这就是 "wrapper" 方法可能发挥作用的地方。例如,图本身可能有这样一个包装函数,它为递归函数构建参数
我正在使用递归函数来计算从一个节点开始到另一个给定一组规则(例如:minimum/maximum/exact 停靠点数)的图形可能遍历的次数。
我想知道调用递归函数而不是直接调用它的包装函数是否是一个好习惯。大多数时候我看到人们使用包装函数。
只是想知道为什么以及优缺点是什么以及在什么情况下我们必须包装它?
不,这并不总是必要的。只有在有特定原因时才需要包装它。以下是您可能需要包装它的几个原因:
- 如果它传递给自己的参数与它在初始调用中收到的参数不同,无论出于何种原因
- 也许递归参数很复杂,调用者很难为它们提供适当的初始值
- 也许初始参数与递归参数明显不同
- 如果您需要起始位置(例如包装器)具有与递归方法本身不同的访问级别。
可能还有几个。
但是很多递归方法不需要换行。例如,带有谓词的经典深度优先节点遍历方法不需要在递归期间与初始调用期间传递任何特殊内容,因此无需包装它。
递归函数通常需要一个参数来表示先前调用的累积结果。问题域中的一个假设示例是
public int numberOfPossibleTraversals(Node node, List<Rule> rules) { ...
所以每次递归调用都会修改第一个参数。您使用这样的起始值开始调用链
int c = numberOfPossibleTraversals(root, rules);
有时(取决于具体实现)为累积参数建立初始值可能需要一些 logic/processing。这就是 "wrapper" 方法可能发挥作用的地方。例如,图本身可能有这样一个包装函数,它为递归函数构建参数