Хорошо, функция-обертка будет служить цели (иначе не было бы никаких причин для ее существования).
Одной из таких целей может быть проверка правильности ввода перед вызовом фактической рекурсивной функции (как в вашем примере), например, вот так:
public static int recursive(int n){
//do something
.
.
.
}
public static int recursiveWrap(int n){
if( n < 0 ) {
throw new IllegalArgumentException("only positive arguments are allowed");
}
return recursive(n);
}
Другой целью может быть предоставить удобную точку входа для рекурсии, например, для быстрой сортировки (я просто буду использовать int[]
для простоты, в реальном мире более вероятно использование обобщенных c массивов или списков):
private static void recursiveQS(int[] array, int left, int right) {
//actual implementation here
}
//that's what the user would call
public static void quickSort(int[] array) {
recursiveQS(array, 0, array.length);
}
Почему вы хотите использовать функции-оболочки? Существует несколько возможных причин:
- Сохраняйте рекурсивную функцию как можно более простой.
- Проверки валидации часто необходимо выполнять один раз, поэтому выполнение этой функции в рекурсивной функции приведет к выполнению ненужного кода ( и, таким образом, приводит к снижению производительности).
- Обеспечение простой точки входа для вызывающих абонентов и обработка любого сопоставления параметров, настройка и т. д. c. в оболочке.
- Для рекурсивных функций более общего назначения может потребоваться специальная проверка или настройка, которая применяется только к определенным ситуациям и типам параметров. В этих случаях вы можете захотеть предоставить специальные функции-оболочки для особых случаев, то есть вы снова сделаете рекурсивную функцию максимально простой.